关闭

MysqlParameters参数

417人阅读 评论(0) 收藏 举报
分类:


  • 语法:如何定义参数
    全选示例 :
    1.CREATE PROCEDURE pro1()...
    2.CREATE PROCEDURE pro2([IN] para_name DATA-TYPE)...
    3.CREATE PROCEDURE pro3(OUT para_name DATA-TYPE)...
    4.CREATE PROCEDURE pro4(INOUT para_name DATA-TYPE)...
    

解释:上面的例子中,第一个表示无参数的;第二个表示有一个输入参数,这里的IN是可选的,因为默认为输入参数;第三个表示有一个输出参数,即返回值;第四个有一个既可作为输入又可作为输出的参数。

  • 实例解析1
    全选示例:创建存储过程及定义参数 :
    DELIMITER $$
    
    USE `mrms_dev`$$
    
    DROP PROCEDURE IF EXISTS `mrms_procedure_strategyExceedCutAll`$$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `mrms_procedure_strategyExceedCutAll`(
        IN  tmp_enterpriseEnglishName  VARCHAR(5),
        IN  tmp_code VARCHAR(20),
        IN  tmp_classes VARCHAR(20),
        IN  tmp_typeName VARCHAR(20),
        IN  tmp_medicineName VARCHAR(50),
        IN  tmp_agent VARCHAR(50),
        IN  tmp_guige VARCHAR(60),
        IN  tmp_unit VARCHAR(20),
        IN  tmp_total INT(11),
        IN  tmp_unitPrice FLOAT,
        IN  tmp_totalPrice FLOAT,
        IN  tmp_maker VARCHAR(100),
        IN  tmp_createTime TIMESTAMP,
        IN  tmp_comment VARCHAR(100),
        IN  tmp_status INT(11),
        IN  tmp_isBackUp TINYINT(1),
        -- 以上均为输入参数
        
        INOUT tmp_sum_price FLOAT, /* 输入输出参数:在此存储过程中可以直接使用,并将
                                   计算结果返回给调用者。*/
        INOUT tmp_sum_count INT, -- 输入输出参数
        IN tmp_plan_price FLOAT,
        IN tmp_plan_count INT,
        IN i INT,
        INOUT hasMain BOOLEAN) -- 输入输出参数
    BEGIN
    	-- 声明临时变量,用于cur插入字段 --
    	DECLARE insert_cur_total INT(11) DEFAULT 0;  
    	DECLARE insert_cur_totalPrice FLOAT DEFAULT 0;
             
    	     -- 由于临时表进行排序,第一条肯定是主药品
    	     IF i = 0 THEN 
                      IF tmp_isBackUp =0 THEN 
                         SET hasMain = TRUE;
                         IF tmp_sum_price < tmp_plan_price || tmp_sum_count < tmp_plan_count THEN
                             
                             -- 由于第一次录的是主药品,不可能在录入之前就满足计划了(前提是计划数据不为0)
                             
                             IF (tmp_sum_count + tmp_total) >= tmp_plan_count THEN
    				SET insert_cur_total = tmp_plan_count - tmp_sum_count;
    		         ELSE
    				SET insert_cur_total = tmp_total;
    		         END IF;
    		         IF (tmp_sum_price + tmp_totalPrice) >= tmp_plan_price THEN
    				SET insert_cur_totalPrice = tmp_plan_price - tmp_sum_price;
    		         ELSE
    				SET insert_cur_totalPrice = tmp_totalPrice;
    		         END IF;
    		         INSERT INTO      
                                    mrms_medicine_info_cur(enterpriseEnglishName,
                                    CODE,classes,typeName,medicineName,agent,
                                    guige,unit,total,unitPrice,totalPrice,
                                    maker,createTime,COMMENT,STATUS,isBackUp) 
    		             VALUES (tmp_enterpriseEnglishName,tmp_code,
                                    tmp_classes,tmp_typeName,tmp_medicineName,
                                    tmp_agent,tmp_guige,tmp_unit,insert_cur_total,
                                    tmp_unitPrice,insert_cur_totalPrice,tmp_maker,
                                    tmp_createTime,tmp_comment,tmp_status,
                                    tmp_isBackUp);
    		         
    		         SET tmp_sum_price = tmp_sum_price + insert_cur_totalPrice;
    		         SET tmp_sum_count = tmp_sum_count + insert_cur_total;
    		         
                         END IF;
                         
    	          END IF;
                 ELSE 
                      IF hasMain = TRUE && tmp_isBackUp = 1 && ( tmp_sum_price < tmp_plan_price || tmp_sum_count < tmp_plan_count ) THEN
    		     
                             -- 由于主药品已经进行了截取,所以tmp_sum_count不可能大于tmp_plan_count
                             IF tmp_sum_count = tmp_plan_count THEN  -- 计划数量已经录够
    				SET insert_cur_total = 0;
    			 ELSE
    				IF (tmp_sum_count + tmp_total) >= tmp_plan_count THEN
    					SET insert_cur_total = tmp_plan_count - tmp_sum_count;
    				ELSE
    					SET insert_cur_total = tmp_total;
    				END IF;
    			 END IF;	
                             
                             IF tmp_sum_price = tmp_plan_price THEN -- 计划金额已经录够
    				SET insert_cur_totalPrice = 0;
                             ELSE
    				IF (tmp_sum_price + tmp_totalPrice) >= tmp_plan_price THEN
    					SET insert_cur_totalPrice = tmp_plan_price - tmp_sum_price;
    				ELSE
    					SET insert_cur_totalPrice = tmp_totalPrice;
    				END IF;
                             END IF;
    		         
    		         INSERT INTO 
                                    mrms_medicine_info_cur(enterpriseEnglishName,
                                    CODE,classes,typeName,medicineName,agent,
                                    guige,unit,total,unitPrice,totalPrice,
                                    maker,createTime,COMMENT,STATUS,isBackUp) 
    		             VALUES (tmp_enterpriseEnglishName,tmp_code,
                                    mrms_medicine_info_cur(enterpriseEnglishName,
                                    CODE,classes,typeName,medicineName,agent,
                                    guige,unit,total,unitPrice,totalPrice,
                                    maker,createTime,COMMENT,STATUS,isBackUp)    
    		        
    		         SET tmp_sum_price = tmp_sum_price +       insert_cur_totalPrice;
    		         SET tmp_sum_count = tmp_sum_count + insert_cur_total;  
    		         
                      END IF;
                      
                 END IF;
                 
            
        END$$
    
    DELIMITER ;
    
  • 实例解析2
    全选示例:调用存储过程,及获取返回结果 :
    /*注:只拿出调用者的部分代码,这些参数已在调用者中定义*/
     CALL mrms_procedure_strategyExceedCutAll(tmp_enterpriseEnglishName,
    					tmp_code,
    					tmp_classes,
    					tmp_typeName,
    					tmp_medicineName,
    				        tmp_agent,
    					tmp_guige,
    					tmp_unit,
    					tmp_total,
    					tmp_unitPrice,
    					tmp_totalPrice,
    					tmp_maker,
    					tmp_createTime,
    					tmp_comment,
    					tmp_status,
    					tmp_isBackUp,
    					tmp_sum_price,--输入输出参数
    				        tmp_sum_count,--输入输出参数
    					tmp_plan_price,
    					tmp_plan_count,
    					i,
    					hasMain --输入输出参数
                                            );	      	      
    /*注:INOUT参数在调用这种通过返回值,直接给现有变量赋值,如上*/
    
  • 实例解析3
    全选示例:单独解析输出(OUT)参数用法 :
    DELIMITER $$
    
    USE `test_dev`$$
    
    DROP PROCEDURE IF EXISTS `mrms_procedure_strategyExceedStop`$$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `mrms_procedure_strategyExceedStop`(
        IN  tmp_enterpriseEnglishName  VARCHAR(5),
        IN  tmp_code VARCHAR(20),
        IN  tmp_classes VARCHAR(20),
        IN  tmp_typeName VARCHAR(20),
        IN  tmp_medicineName VARCHAR(50),
        IN  tmp_agent VARCHAR(50),
        IN  tmp_guige VARCHAR(60),
        IN  tmp_unit VARCHAR(20),
        IN  tmp_total INT(11),
        IN  tmp_unitPrice FLOAT,
        IN  tmp_totalPrice FLOAT,
        IN  tmp_maker VARCHAR(100),
        IN  tmp_createTime TIMESTAMP,
        IN  tmp_comment VARCHAR(100),
        IN  tmp_status INT(11),
        IN  tmp_isBackUp TINYINT(1),
        
        IN tmp_sum_price FLOAT,
        IN tmp_sum_count INT,
        IN tmp_plan_price FLOAT,
        IN tmp_plan_count INT,
        IN i INT,
        IN hasMain BOOLEAN,
        -- 以上均为输入参数
        OUT tmp_sum_price_out FLOAT,-- 输出参数
        OUT tmp_sum_count_out INT, -- 输出参数
        OUT hasMain_out BOOLEAN)-- 输出参数
    BEGIN
    	     IF i = 0 THEN 
                      IF tmp_isBackUp =0 THEN
                         SET hasMain = TRUE;
                         IF tmp_sum_price < tmp_plan_price || tmp_sum_count < tmp_plan_count THEN
                             INSERT INTO 
                                      mrms_medicine_info_cur(enterpriseEnglishName,
                                      CODE,classes,typeName,medicineName,agent,
                                      guige,unit,total,unitPrice,totalPrice,
                                      maker,createTime,COMMENT,STATUS,isBackUp) 
    
                                  VALUES (tmp_enterpriseEnglishName,tmp_code,
                                      tmp_classes,tmp_typeName,tmp_medicineName,
                                      tmp_agent,tmp_guige,tmp_unit,tmp_total,
                                      tmp_unitPrice,tmp_totalPrice,tmp_maker,
                                      tmp_createTime,tmp_comment,tmp_status,
                                      tmp_isBackUp);
                               
                             -- 通过输入给输出赋值  
                             SET tmp_sum_price_out = tmp_sum_price + tmp_totalPrice;
                             SET tmp_sum_count_out = tmp_sum_count + tmp_total;
                             
                             SET hasMain_out = hasMain;
    			 
                         END IF;
                 
                      END IF;
                 ELSE 
                      IF hasMain = TRUE && tmp_isBackUp = 1 && ( tmp_sum_price < tmp_plan_price || tmp_sum_count < tmp_plan_count ) THEN
                          INSERT INTO mrms_medicine_info_cur(enterpriseEnglishName,
                                      CODE,classes,typeName,medicineName,agent,
                                      guige,unit,total,unitPrice,totalPrice,
                                      maker,createTime,COMMENT,STATUS,isBackUp) 
    
                                  VALUES (tmp_enterpriseEnglishName,tmp_code,
                                      tmp_classes,tmp_typeName,tmp_medicineName,
                                      tmp_agent,tmp_guige,tmp_unit,tmp_total,
                                      tmp_unitPrice,tmp_totalPrice,tmp_maker,
                                      tmp_createTime,tmp_comment,tmp_status,
                                      tmp_isBackUp);
                               
                          -- 通过输入给输出赋值     
                          SET tmp_sum_price_out = tmp_sum_price + tmp_totalPrice;
                          SET tmp_sum_count_out = tmp_sum_count + tmp_total;
                             
                          SET hasMain_out = hasMain;
                          
                      END IF;
                      
                 END IF;
                 
        END$$
    
    DELIMITER ;
    /*注:IN tmp_sum_price和OUT tmp_sum_price_out表示同样的意义,
          IN tmp_sum_count和OUT tmp_sum_count_out表示同样的意义,
          IN hasMain和OUT hasMain_out表示同样的意义
          只是将输入和输出完全分开,其实像这样情况完全可以按照实例解析2中的INOUT
          参数来处理*/
    
  • 实例解析4
    全选示例:调用存储过程,及获取返回结果(OUT参数) :
    CALL mrms_procedure_strategyExceedStop(tmp_enterpriseEnglishName,
    					tmp_code,
    					tmp_classes,
    					tmp_typeName,
    					tmp_medicineName,
    					tmp_agent,
    					tmp_guige,
    					tmp_unit,
    					tmp_total,
    					tmp_unitPrice,
    					tmp_totalPrice,
    					tmp_maker,
    					tmp_createTime,
    					tmp_comment,
    					tmp_status,
    					tmp_isBackUp,
    					tmp_sum_price,
    					tmp_sum_count,
    					tmp_plan_price,
    					tmp_plan_count,
    					i,
    					hasMain,
    					@tmp_sum_price_out,-- OUT参数
    					@tmp_sum_count_out,-- OUT参数
    					@hasMain_out);-- OUT参数
                                            -- 调用时OUT参数必须加'@',
                                               并每个参数按顺序排列) 
    		
                    -- 输出参数给现有的变量赋值				      
    		SELECT @tmp_sum_price_out INTO tmp_sum_price;
    		SELECT @tmp_sum_count_out INTO tmp_plan_count;
    		SELECT @hasMain_out INTO hasMain;
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:25225次
    • 积分:608
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类