Mysql 存储过程

93 阅读1分钟

存储过程的基本语句格式

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,...])
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
	BEGIN
		[DECLARE 变量名 类型 [DEFAULT 值];]
		存储过程的语句块;
	END$$

DELIMITER ;

  • 存储过程中的参数分别是 in,out,inout三种类型
  1. in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定。
  2. ou代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序。
  3. inout代表即时输入参数,又是输出参数,表示该参数的值即可有调用程序制定,又可以将inout参数的计算结果返回给调用程序。
  • 存储过程中的语句必须包含在BEGIN和END之间。
  • DECLARE中用来声明变量,变量默认赋值使用的DEFAULT,语句块中改变变量值,使用SET 变量=值

存储过程的使用

CREATE
   
    PROCEDURE dtcmscoredb.insert_article_en()
   
	BEGIN
	
     DECLARE my_Id int default 0;
         -- 定义变量
	 DECLARE my_SiteId int default 2;
	 DECLARE my_ChannelId int default 11;
	 DECLARE my_Title varchar(200);
	 DECLARE my_ImgUrl varchar(200);
         /*
	 DECLARE my_SortId int default 0;
 	 DECLARE my_Click int default 0;
 	 DECLARE my_Status int default 0;
 	 DECLARE my_IsComment int default 0;
 	 DECLARE my_CommentCount int default 0;
 	 DECLARE my_LikeCount int default 0;
 	 DECLARE my_AddTime datetime DELETE now();
         */
	
	 DECLARE done INT DEFAULT FALSE;
	 -- 定义游标	
	 DECLARE cursor_article CURSOR FOR ( SELECT   x.Title,  x.ImgUrl,   x.SortId FROM dtcmscoredb.dt_articles x WHERE Id between 366 and 367 );
	
	 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 监听器,
	
        -- 打开游标
	 OPEN cursor_article;
	         -- 定义循环
		 loop_cursor:LOOP
		   -- 取出一行数据,并设置变量
		   FETCH cursor_article INTO my_Title, my_ImgUrl , my_SortId;
		 
		   IF done THEN 
                        -- 跳出循环
		    	LEAVE loop_cursor;
		    
		   ELSE
		    -- 循环插入数据
		    INSERT INTO dtcmscoredb.dt_articles (SiteId, ChannelId, CallIndex, Title, Source, Author, LinkUrl, ImgUrl, SeoTitle, SeoKeyword, SeoDescription, Zhaiyao, Content, SortId, Click, GroupIds, Status, IsComment, CommentCount, LikeCount, AddBy, AddTime, UpdateBy, UpdateTime) VALUES(my_SiteId, my_ChannelId, '', my_Title, '', '', '', my_ImgUrl, '', '', '', '', '', my_SortId, 100, NULL, 0, 0, 0, 0, 'admin', '2022-09-06 12:10:29.0', 'admin', NULL);
                     -- 获取插入dt_articles数据主键id
	            select max(Id) from dtcmscoredb.dt_articles INTO my_Id;
                     -- 循环插入dt_article_category_relation数据
	            INSERT INTO dtcmscoredb.dt_article_category_relation (ArticleId, CategoryId) VALUES(my_Id, 31);
	       
	      END IF;
	     END LOOP loop_cursor;
	     
	 -- 关闭游标
	 CLOSE cursor_article;
  
	
    
	END 
;
-- 调用存储过程
CALL insert_article_en();