解决方案:存储过程不返回数据,但它能创建和填充另一个表。所以在存储过程运行中创建临时表。该临时表将保存存储过程中生成的结果集,在遍历游标时,用insert保存每条数据到临时表中。后续调用时可以用select语句查询临时表中的存储过程运行结果。
以下有 三种方式 使用游标创建一个存储过程,统计某一部门下的员工信息
方法一:Loop循环
调用存储过程:
方法二:While 循环
调用存储过程:
方法三:REPEAT 循环
调用存储过程:
上述三种实现方法在测试过程中遇到下述问题。
调用存储过程查询临时表输出结果时,会发现多循环了一次,像这样:
解决方法:
在遍历游标查询结果时,先判断游标的结束标志(done) 是否是为1,如果不是1,则向临时表中插入数据。
上一节存储过程封装的都是简单的select语句,直接使用被封装的语句就能完成。所以存储过程往往应用于更复杂的业务规则处理时更有效
看一个例子
这个例子使用元素比较多,解释一下:
COMMENT为表添加了一句注释;
-- 单行注释,注释跟在后面的内容,需要注意-- 后需要加一个空格才能生效;
(#注释内容 /*注释内容*/ 这两种方法也能进行注释)
Declare用来声明变量,一句declare只能声明一个变量,变量必须先声明后使用
If...Then是进行条件判断的,基本语句如下:
If ... Then ... Else ... End If
这个存储过程完成了订单合计,并判断该订单是否需要增加营业税。taxable是一个布尔值(如果要增税为真,否则为假)。在存储体中定义了两个局部变量。并将结果存储到局部变量total中。if语句检查taxable是否为真,如果为真,则用另一条select语句增加营业税。最后将total结果保存到ototal中。
调用结果如下:
检查存储过程
SHOW CREATE PROCEDURE 过程名
为了获得包括何时、由谁创建等详细信息的存储过程列表,使用
Show procedure status -- 会列出所有存储过程
可以添加过滤,比如
存储过程循环语句
1. while
WHILE (表达式) DO
...
END WHILE
看一个例子
创建了一个循环存储过程,重复向human插入5条记录。下面调用看一下结果
2.repeat
基本语句:
Repeat ...until 条件...END Repeat;
同样 *** 作,使用repeat执行如下
mybatis调用mysql存储过程(返回参数,单结果集,多结果集)
注: RETCODE、RETDESC 这里的输出值不用在函数里 SELECT RETCODE,因为即使没有,当执行成功后会自动返回在对象里(Object/Map),所以在函数里不用SELECT一下了。
Navicat中执行函数需要输入参数值,也是对应图1,@A@B表示输出值。(一个输入值两个输出值)
1. 标注一二三四五处如果存在,则执行成功后返回结果如下
标注一对应结果1
标注二对应结果2
标注三对应结果3
标注四对应结果4
标注五对应结果5
其中结果3返回的是集合。
存在这么多结果,想要取结果3中的集合是不好取的,只有像下图一样只有一个结果才好取出集合。
2. 标注一二四五处如果不存在,则执行成功后返回结果如下
只有结果1,对应的是标注三处的值。可以取出集合
函数p_duplicate_enroll
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)