- 语法:如何定义参数
全选 示例 :
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;