Mysql procedure 存储过程学习,小例子


有份工作,SSH web系统需要多数据库兼容,通过Powerdesigner转换,修改下建立好表结构和索引后,发现了难题了存储过程咋办

例如有以下存储过程,转换好像还蛮麻烦的,下边是Powerdesigner转换过来的mssql类似版本的,不适用于mysql语法,不行,那挨个学习转换过来呗,若哪位厉害的知情人

发现有更好的自动化转换工具,麻烦下方评论告知下,谢谢了!

CREATE PROCEDURE sys_InitLawlessSource @Plugin_DB VARCHAR(50) AS
BEGIN
	DECLARE @fdFormID INT
	DECLARE @LasoName VARCHAR(50)
	DECLARE @tableName VARCHAR(50) 
	DECLARE @FIELDS VARCHAR(100) SET @FIELDS=''
	DECLARE @PriKey VARCHAR(50) SET @PriKey = 'fdID'
	DECLARE @ConnStr VARCHAR(50) SET @ConnStr = 'Plugin_DB'

	IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'FO_Form'))
	BEGIN
		CREATE TABLE FO_Form (
		   fdFormID             INT                  NOT NULL,
		   fdFormName           NVARCHAR(200)        NOT NULL,
		   fdFormTable           NVARCHAR(50)         NOT NULL,
		   CONSTRAINT PK_FO_Form PRIMARY KEY (fdFormID)
		)
	END

	IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'FO_Field'))
	BEGIN
		CREATE TABLE FO_Field (
		   fdFielID             INT                  NOT NULL,
		   fdFielFormID           INT       NOT NULL,
		   fdFielName           NVARCHAR(50)         NOT NULL,
		   fdFielCtrlType           INT       NOT NULL,
		   CONSTRAINT PK_FO_Field PRIMARY KEY (fdFielID)
		)
	END
	
	DECLARE @SQL_Form VARCHAR(1024) SET @SQL_Form=('DELETE FO_Form INSERT FO_Form(fdFormID,fdFormName,fdFormTable)  SELECT fdFormID,fdFormName,fdFormTable FROM '+(@Plugin_DB+'.FO_Form'))
	exec( @SQL_Form)
	DECLARE @SQL_Field VARCHAR(1024) SET @SQL_Field=('DELETE FO_Field INSERT FO_Field(fdFielID,fdFielFormID,fdFielName,fdFielCtrlType)  SELECT fdFielID,fdFielFormID,fdFielName,fdFielCtrlType FROM '+(@Plugin_DB+'.FO_Field') +' WHERE fdFielCtrlType =1 OR fdFielCtrlType =2')
	exec( @SQL_Field)
	
	DECLARE CURSOR_FORMSOURSE CURSOR FOR
	SELECT fdFormID,fdFormName,fdFormTable FROM FO_Form
	OPEN CURSOR_FORMSOURSE
	FETCH NEXT FROM CURSOR_FORMSOURSE INTO @fdFormID,@LasoName,@tableName
	WHILE @@FETCH_STATUS = 0 
	BEGIN
		SELECT @FIELDS= @FIELDS+','+fdFielName FROM FO_Field WHERE fdFielFormID = @fdFormID AND (fdFielCtrlType =1 OR fdFielCtrlType =2)
		
		IF(@FIELDS != '')
		BEGIN
			IF NOT EXISTS(SELECT fdLasoID FROM  FA_Lawless_Source WHERE fdLasoTable=@tableName)
			BEGIN
				INSERT INTO FA_Lawless_Source(fdLasoID,fdLasoName,fdLasoConnStr,fdLasoTable,fdLasoPriKey,fdLasoFields)
				VALUES(90000+@fdFormID,@LasoName,@ConnStr,@tableName,@PriKey,SUBSTRING(@FIELDS,2,(len(@FIELDS)-1)))
			END	
		END
	
	FETCH NEXT FROM CURSOR_FORMSOURSE INTO @fdFormID,@LasoName,@tableName
	END
	CLOSE CURSOR_FORMSOURSE
	DEALLOCATE CURSOR_FORMSOURSE
END;


挨个学习下:

【demo功能:创建存储过程、声明变量、操作查询、调用、删除存储过程】

DELIMITER //
CREATE PROCEDURE sys_InitLawlessSource(
IN Plugin_DB VARCHAR(50)
)
BEGIN
DECLARE fdFormID INT;
SELECT * FROM USER;
END
    //
DELIMITER ;

CALL sys_InitLawlessSource('xxx')

DROP PROCEDURE IF EXISTS  sys_InitLawlessSource


【demo功能:IF EXISTS用法,IF 用法  存储过程创建表的用法】

DROP PROCEDURE IF EXISTS gg;
DELIMITER $$
CREATE PROCEDURE gg()
BEGIN
IF NOT EXISTS(SELECT  * FROM 1go.user WHERE id<1 ) THEN 
CREATE TABLE FO_Form (`fdFormID`             INT                  NOT NULL);
END IF;
END$$
DELIMITER ;

CALL gg;


【demo功能:IF EXISTS用法,IF 用法  存储过程创建表(外键关联)的用法,最后一个Delimiter如果没有加分号,且分号前留有空格,执行会报错,通不过】

DROP PROCEDURE IF EXISTS create_table;

DELIMITER $$
CREATE PROCEDURE create_table()
BEGIN
IF NOT EXISTS (SELECT * FROM USER WHERE id < 1) THEN
CREATE TABLE test_1_tb(
	`id` INT NOT NULL,
	`string1` VARCHAR(255),
	`fdFormID` INT NOT NULL,
	CONSTRAINT PK_FO_Form PRIMARY KEY (fdFormID)
	
);
END IF; 
END$$
DELIMITER ;####这里分号前的空格要保留,否则报以下错误


错误码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 1


【demo功能:execute执行动态sql语句、参数传值和调用】

DROP PROCEDURE IF EXISTS data_trans;

DELIMITER $$
CREATE PROCEDURE data_trans(
IN a VARCHAR(8000),
IN b VARCHAR(8000),
OUT c INT)
BEGIN
DECLARE sql_ VARCHAR(8000);
SET @MyQuery='INSERT INTO fo_form SELECT * FROM fo_form1';
PREPARE sql_ FROM @MyQuery; 
EXECUTE sql_;
END$$
DELIMITER ;


CALL  data_trans('','',@c);


【demo功能:游标使用,execute语句】

DELIMITER $$
DROP PROCEDURE IF EXISTS CursorProc $$
DROP TABLE IF EXISTS infologs $$
CREATE PROCEDURE CursorProc ()  
    BEGIN
     DECLARE  no_more_products , quantity_in_stock INT DEFAULT 0;
     DECLARE  prd_code VARCHAR(255);
     DECLARE  mysql_var VARCHAR(255);

     DECLARE  more_ VARCHAR(255);					  /*	多参数抓取游标,深刻理解游标是什么,其实有点像一行数据集 */  
     
     DECLARE  cur_product CURSOR FOR   SELECT id,email FROM USER;         /*	First: Delcare a cursor,首先这里对游标进行定义	*/  
     
     DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_products = 1;  /*	when "not found" occur,just continue,这个是个条件处理,针对NOT FOUND的条件	*/  
        
      
									  /*	for  loggging information 创建个临时表格来保持	*/  
     /* 
	CREATE TEMPORARY TABLE infologs (  
		Id int(11) NOT NULL AUTO_INCREMENT,  
		emial varchar(255) NOT NULL,  
		PRIMARY KEY (Id)  
	);
     */
									  /*	等同于下边的execute语句	*/  
     
     
     SET @mysql_ = 'CREATE TEMPORARY TABLE infologs ( Id int(11)  NOT NULL AUTO_INCREMENT,  emial varchar(255) NOT NULL,  PRIMARY KEY (Id) )';
     PREPARE mysql_var FROM @mysql_;
     EXECUTE mysql_var;     
     
     IF 1 = 2 THEN
     SELECT id FROM USER;                                                 /*	学习下if else语句	*/  
     ELSE 
     SELECT email FROM USER;                                               
     END IF;
   
    
      
     OPEN  cur_product;                                                   /*	Second: Open the cursor 接着使用OPEN打开游标	*/  
     FETCH  cur_product INTO prd_code,more_;                              /*	Third: now you can Fetch the row 把第一行数据写入变量中,游标也随之指向了记录的第一行	*/  
      
     REPEAT  
      
     SELECT  id INTO quantity_in_stock  
     FROM  USER  
     WHERE  id LIKE CONCAT('%',prd_code);  
       
     IF  quantity_in_stock < 100 THEN  
     INSERT  INTO infologs(emial)  
     VALUES  (prd_code);  
     END  IF;  
     FETCH  cur_product INTO prd_code,more_;  
      
     UNTIL  no_more_products = 1  
     END REPEAT;  
     CLOSE  cur_product;						  /*	Finally: cursor need be closed 用完后记得用CLOSE把资源释放掉	*/  
     /*SELECT *  FROM infologs;*/ 
     /*SELECT *  FROM user;  */
     ##SELECT *  FROM user right join infologs on 1=1; 
     DROP TABLE  infologs;  
    END $$
DELIMITER ;
CALL CursorProc;





未完待续!!!!持续学习中,学会了,就把上边的语法转换成mysql的存储过程.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值