局部变量
仅在本存储过程中有效的变量。局部变量不允许有缺省值
全局变量
在同一用户活动期间,存储过程中的可被同一数据库的其他存储过程访问的变量。全局变量必须在所有使用的存储过程中定义,并且必须给出缺省值,实际的缺省值是第一次被访问时定义的缺省值。
局部变量的范围
变量在语句块内有效,如语句块嵌套,则同名的内层定义覆盖其外层定义,内层语句执行完成后,外层定义重新有效。
变量的定义
用define定义变量。
如: define x int;
变量四种赋值方式
- 利用let语句
- 利用select或select…into语句
- 利用call语句
- 利用execute procedure…into语句
例子:
- let a, b = c, d;
- let a, b = (select empname, empno from emp
where empno = 125);
- select empname into name from emp
where empno = 120;
- execute procedure read_address('Lamitry')
into p_fname, p_lname, p_addr;
- call read_address('Lamitry')
returning p_fname, p_lname, p_addr;
存储过程表达式
存储过程表达式可以是除聚集函数表达式外的任何SQL算术表达式
例子:
var 1; var1 + var2 + 5 ;
get_duedat(lastname = 'Lamitry');
IF - THEN - ELSE
格式:
if ··· then
···
elif ··· then
···
else
···
end if
循环语句WHILE
while与foreach的区别:
while循环的条件是不定的,循环次数不定,因而可能出现无穷循环;
for与foreach循环的条件是确定的,循环次数也是明确的,不可能出现无穷循环。
例子:
let i = 1;
while i<10
insert into tab2 values(i);
let i = i+1;
end while
循环语句FOREACH
用foreach语句可以查询或操作一组数据
foreach隐式定义并打开一个游标
三种格式:
- FOREACH [WITH HOLD] SELECT … INTO 语句
语句块 END FOREACH; - FOREACH 游标名[WITH HOLD] FOR SELECT … INTO 语句
语句块 END FOREACH; - FOREACH EXECUTE PROCEDURE 存储过程名(参数…参数)
… INTO 变量[,变量[,…]] 语句块 END FOREACH;
FOREACH定义的游标在以下情况下关闭:
1. 无行返回
2. 事务提交或回滚导致非保护游标关闭
3. 循环非正常退出(使用EXIT或ON EXCEPTION)
临时表
创建与删除:
create temp 名....... drop tabel 名 cascade;
事务控制
事务的作用:维护数据的一致性。
on exception
rollback work;
end exception
begin work;
delete from....
update ...
insert into ...
commit work;
异常处理
如果存储过程中没有异常处理语句,那么运行到异常处将会中断。
异常捕获:ON EXCEPTION
示例:下例捕获多个错误,并采取相应的措施。若错误号为300采取措施B,若错误号为210,211,212采取措施A,若为其他错误,采取措施C
on exception set error_num
---Action c
end exception
on exception in(-300)set error_num
---Action b
end exception
on exception in(-210,-211,-212)set error_num
---Action a
end exception
异常捕获:RAISE EXCEPTION
用RAISE EXCEPTION语句模拟异常的产生,该异常可被ON EXCEPTION语句捕获。
格式:
RAISE EXCEPTION 错误号,ISAM 错误号, 错误 文本变量
SQL错误号和ISAM错误号均可使SPL表达式,且其计算结果是一个常数(错误号)
存储过程的权限
两类存储过程
- DBA权限存储过程
- 所有者权限存储过程
下列用户可以创建存储过程
- 具有RESOURCE权限的用户可以创建存储过程
下列用户可以执行存储过程
- DBA用户
- 存储过程的创建者
- 具有EXECUTE权限的用户