result sets:
stored procedure通过cursor来传递结果集给调用者。存储过程必须为每一个需要返回的结果集保留一个游标。
>使用with return to caller/client来指定结果集返回的对象。指定为client将使得中间调用的routine不能获得结果集,只有client才能获得。
>使用dynamic result sets 语句来指定返回结果集的数目,这个数目保存在syscat.routines视图的result_sets字段。如果实际返回的结果集数目大于声明的这个数目,将发出一个warning(sqlcode +464,sqlstate 0100E)
sql stored procedure返回结果集的操作步骤:
1)declare cursor:
如:declare clientcur cursor with return to caller for select * from staff;
2)open the cursor:如 open clientcur;
3)不关闭游标退出stored procedure
开发:
最后终于来到了真正的开发了,刚才讲到sql procedure是由sql,sql pl写的,sql就没什么好说的了。关键说说sql pl (procedural language)
>>功能:控制逻辑流向,声明和设置变量,处理警告和异常。可用于例程(routine),触发器,动态复合语句(单个调用中的sql语句块)
>>控制语句:declare,set,for,get diagnostics,if,iterate,leave,return,signal,while
>>sql pl不能执行的sql:table,index,view的create和drop
>>begin atomic 开头,end 结尾
>>declare :定义变量 和 定义出错处理
declare sql-var-name data-type default default-values
declare condition-name condition for sqlstate value... //这里的condition一般做“异常”解释
>>set:声明变量 和 给触发器定义中的表中的列赋值
set pay = select salary from employee where empno = 5;//仅返回一个值
set pay = null;//空值
set pay = default;//变量定义的默认值
//专用寄存器的内容
set userid = userid;
set today = current date;
//同时给多个变量赋值
set pay =10000,bonus = 1500;
set (pay,bonus) = (10000,1500);
set (pay,bonus) = select (pay,bonus) from employee where empno = 5;
>>if/then/else
三种形式:
1) if then/end if 语句块
2) if then/else/end if
3) if then/elseif /else/end if
可以在if/then/else 语句中使用sql运算符,如:
if (salary between 10000 and 90000) then...
if (deptno in ('a00','b01')) then..
if (exist (select * from employee)) then...
if (select count(*) from employee)>0) then..
>>while
label:
while condition do
...sql pl ..
end while lable; //label可选
>>for:用于循环select返回结果集的行
格式:
label:
for row_label as select satement do
..sql pl..
end for label;//label可选
例子:
for emp as select * from employee where bonus >1000 do
set total_bonus = total_bonus +emp.bonus;
end for;
>>iterate:用来回到for或者while循环的开始重新执行
check_bonus:
for emp as select * from employee do
if(emp.bonus>10000) then
set total_bonus = total_bonus +emp.bonus;
else
iterate check_bonus;
end if;
end for check_bonus;
>>leave:相当于java中的break,需要一个label
>>signal:对出现异常的应用程序报警
signal sqlstate value set message_text = '...';//自定义一个sqlstate,7、8、9和I~Z开头的sqlstate
signal condition set message_text = '...';//自定义异常condition
>>get diagnostics:用在sql pl触发器或语句块(不是函数)内,返回update,insert,delete语句影响的记录数。
get diagnostics variable = row_count;