MySQL存储过程游标循环介绍
一些简单的调用和语法规则在这里是多余的,在因特网上有很多例子,主要是关于常用游标和循环嵌套的使用。
首先,介绍了循环的分类。
(1)而…结束的时候
(2)回路…结束循环
(3)重复…末端重复
(4)转到
这里有三个标准循环:while循环、循环循环和重复循环。还有一个非标准循环模式:转到(不引入)。
(1)而…结束的时候
复制代码代码如下所示:
创建程序(P14)
开始
声明v;
设置v=0;
而V<5
插入t值(v);
设置V=v + 1;
结束的时候;
结束;
这是while循环的方式,它类似于if语句,并使用设置= 0语句来防止常见错误。如果没有初始化,则默认变量值为null,NULL和任何值操作结果为null。
(2)重复…末端重复
复制代码代码如下所示:
创建程序(P15)
开始
声明v;
设置v=0;
重复
插入t值(v);
设置V=v + 1;
直到v = 5
末端重复;
结束;
这是重复循环的一个例子,它的功能与前一个while循环相同,不同的是在执行之后检查结果,而while是一个预执行检查。它类似于do语句。注意后面语句后面没有分号。这里不能写分号。当然,您可以添加额外的分号。
(3)回路…结束循环
复制代码代码如下所示:
创建过程(P16)
开始
声明v;
设置v=0;
loop_label:环
插入t值(v);
设置V=v + 1;
如果v或5然后
离开loop_label;
最后如果;
结束循环;
结束;
上面是循环循环的一个例子,循环循环不需要一个初始条件,类似于while循环,它不需要结束条件,也不需要重复循环。
迭代迭代
如果目标是一个迭代(迭代)语句,则必须使用休假语句。
复制代码代码如下所示:
创建程序P20()
开始
声明v;
设置v=0;
loop_label:环
如果v = 3然后
设置V=v + 1;
迭代loop_label;
最后如果;
插入t值(v);
设置V=v + 1;
如果v或5然后
离开loop_label;
最后如果;
结束循环;
结束;
迭代(迭代)语句和左语句也是循环中的循环引用。这有点像C语言中的继续。类似地,它可以出现在复合语句中,使用复合语句标签,而迭代(迭代)意味着重新启动复合语句。
以上是介绍循环的几个条件,然后我们用游标介绍一个例子来详细解释。
复制代码代码如下所示:
开始
声明p_feecode varchar(20);
声明p_feename varchar(20);
声明p_billmoney浮(12);
声明p_schememoney浮(12);
声明allmoney浮(10);
声明allusedmoney浮(10);
声明p_year varchar(50);
声明p_totalcompeleterate浮(12);
声明完成int(10);
声明标志int(2);
声明feecodecursor光标选择feecode费; / /声明游标变量
声明未找到的已完成集= 1的持续处理程序;
设置完成= 0;
选择date_format(现在的()(),Y)为p_year;
打开feecodecursor; / /打开游标
loop_label:环
取feecodecursor为p_feecode; / /光标移动到变量声明
如果做= 1然后
离开loop_label;
其他的
设置标志= 0;
最后如果;
集p_schememoney = 0;
集p_billmoney = 0;
选择feename为p_feename费,feecode = p_feecode;
选择和(billmoney)从bill_data哪里feecode = p_feecode和billdate像Concat到p_billmoney(p_year,%);
选择schememoney为p_schememoney从total_scheme哪里feecode = p_feecode和schemedate像连接限制1(p_year,%);
如果标志= 0,那么
设置完成= 0;
最后如果;
如果p_schememoney = 0
集p_totalcompeleterate = - 1;
其他的
集p_totalcompeleterate =(1×p_billmoney) / p_schememoney;
最后如果;
插入total_summary值(p_feecode,p_feename,p_year,p_billmoney,p_totalcompeleterate);
承诺;
结束循环;
近feecodecursor; / /关闭游标循环结束后
终点
以上只是一个简单的例子,说明如何使用。您不需要关注特定的业务逻辑。你只需要关注标志位的值的修改,当循环。和游标声明如何使用它,并没有什么大的差别的具体操作之间的内部和普通的SQL语句。下面是一层循环,和复杂的业务需要两层三层,继续被嵌套在同样的方式。双嵌套循环如下,你只需要集中精力在嵌套结构。
复制代码代码如下所示:
开始
声明p_projectid varchar(20);
声明p_projectname varchar(20);
声明p_feecode varchar(20);
声明p_feename varchar(20);
声明p_projectschememoney浮(10);
声明p_projectmoney浮(10);
声明p_billmoney浮(10);
声明p_year varchar(50);
声明p_projectfeecompeleterate浮(10);
声明done1 int(10);
声明done2 int(10);
声明标志int(2);
声明feecodecursor光标选择feecode费;
声明继续处理程序没有找到设置done1 = 1;
集done1 = 0;
选择date_format(现在的()(),Y)为p_year;
删除从project_fee_summary;
打开feecodecursor;
重复/开始嵌套的第一级
取feecodecursor为p_feecode;
选择feename为p_feename费,feecode = p_feecode;
如果不done1然后
开始
声明projectidcursor光标选择projectid项目;
声明继续处理程序没有找到设置done2 = 1;
集done2 = 0;
打开projectidcursor;
loop_label: / /环二层嵌套开始
取projectidcursor为p_projectid;
选择项目名为p_projectname从项目projectid = p_projectid;
如果done2 = 1
离开loop_label;
其他的
设置标志= 0;
最后如果;
如果不done2然后
集p_projectschememoney = 0;
选择和(billmoney)从bill_data哪里feecode = p_feecode和projectid = p_projectid和billdate像Concat到p_billmoney(p_year,%);
选择projectschememoney为p_projectschememoney从project_scheme哪里feecode = p_feecode和projectid = p_projectid;
如果标志= 0,那么
集done2 = 0;
最后如果;
如果p_projectschememoney = 0
集p_projectfeecompeleterate = - 1;
其他的
集p_projectfeecompeleterate =(1×p_billmoney) / p_projectschememoney;
最后如果;
插入project_fee_summary值(p_feecode,p_projectid,p_projectname,p_feename,p_year,p_billmoney,p_projectfeecompeleterate,p_projectfeecompeleterate)。
最后如果;
结束循环;
选择和(billmoney)从bill_data哪里feecode = p_feecode和billdate像Concat到p_projectmoney(p_year,%);
集p_projectfeecompeleterate =(1×p_projectmoney) / p_projectschememoney;
插入project_fee_summary值(p_feecode,全
近projectidcursor;
结束;
最后如果;
直到done1
末端重复;
近feecodecursor;
终点