[size=medium]
704
一些补充
1、存储过程的参数
in:输入参数,用于向过程传入一个值
实际参数可以是一个具体的值或一个有值的变量
out:输出参数,用于从被调用的过程中返回一个值
实际参数必须是一个变量
in out:用于向过程传入一个初始值,返回更新后的值
实际参数必须是一个预先已经赋值的变量
2、游标
-- 定义一个不带参数的游标emp_cur1
cursor emp_cur1 is select * from employee;
-- 定义一个带参数的游标emp_cur2
cursor emp_cur2 (empno_in in number) is select name,hiredate from employee where empno = empno_in;
-- 定义一个带有return 子句的游标
cursor emp_cur3 return employee%rowtype is select * from employee where empno = 1;
想通过游标更新数据,必须在select语句后加上for update,则select的所有行都被锁定
for update of 列名 则该列被锁定,不影响其他列修改
nowait
where current of 游标名
指向游标当前指向的行
-1.具有返回类型的,称为有约束的游标或者强游标
type type_name is ref cursor return return_type;
-2.没有返回类型的,称为无约束的游标或者弱游标
type type_name is ref cursor
3、例外处理
--预定义异常
no_data_found too_many_rows
--非预定义异常
pragma exception_init(<exception_name>,<handle_code>)
将一个Oracle错误编号与异常名建立起来
--用户自定义异常
raise
--RAISE_APPLICATION_ERROR
将应用程序专有的错误从服务器端转达到客户端应用程序
RAISE_APPLICATION_ERROR (error_number_in IN NUMBER, error_msg_in IN VARCHAR2);
error_number_in 之容许从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突 error_msg_in 的长度不能超过 2K,否则截取 2K。
--内置函数 SQLCODE SQLERRM
返回Oracle的错误代码和错误消息。
4、执行动态SQL
EXECUTE IMMEDIATE 'delete from '||p_table_name;
5、触发器
--语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
--行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
for each row
--old new
insert update delete
:NEW null 实际值 实际值
:OLD 实际值 实际值 null
REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。
[/size]
704
一些补充
1、存储过程的参数
in:输入参数,用于向过程传入一个值
实际参数可以是一个具体的值或一个有值的变量
out:输出参数,用于从被调用的过程中返回一个值
实际参数必须是一个变量
in out:用于向过程传入一个初始值,返回更新后的值
实际参数必须是一个预先已经赋值的变量
2、游标
-- 定义一个不带参数的游标emp_cur1
cursor emp_cur1 is select * from employee;
-- 定义一个带参数的游标emp_cur2
cursor emp_cur2 (empno_in in number) is select name,hiredate from employee where empno = empno_in;
-- 定义一个带有return 子句的游标
cursor emp_cur3 return employee%rowtype is select * from employee where empno = 1;
想通过游标更新数据,必须在select语句后加上for update,则select的所有行都被锁定
for update of 列名 则该列被锁定,不影响其他列修改
nowait
where current of 游标名
指向游标当前指向的行
-1.具有返回类型的,称为有约束的游标或者强游标
type type_name is ref cursor return return_type;
-2.没有返回类型的,称为无约束的游标或者弱游标
type type_name is ref cursor
3、例外处理
--预定义异常
no_data_found too_many_rows
--非预定义异常
pragma exception_init(<exception_name>,<handle_code>)
将一个Oracle错误编号与异常名建立起来
--用户自定义异常
raise
--RAISE_APPLICATION_ERROR
将应用程序专有的错误从服务器端转达到客户端应用程序
RAISE_APPLICATION_ERROR (error_number_in IN NUMBER, error_msg_in IN VARCHAR2);
error_number_in 之容许从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突 error_msg_in 的长度不能超过 2K,否则截取 2K。
--内置函数 SQLCODE SQLERRM
返回Oracle的错误代码和错误消息。
4、执行动态SQL
EXECUTE IMMEDIATE 'delete from '||p_table_name;
5、触发器
--语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
--行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
for each row
--old new
insert update delete
:NEW null 实际值 实际值
:OLD 实际值 实际值 null
REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。
[/size]