Oracle9i 开发指南:PL/SQL程序设计 清华大学出版社 ISBN 7-302-08002-x
Ben整理 2004年 秋
MSN: mascotzhuang@hotmail.com declare type rc_dept is record ( myid dept.id%type, myname dept.name%type, myaddr dept.addr%type ); tb rc_dept; begin begin 内层错误捕捉其始点,在此之前发生的错误由外层进行捕捉。 select id,name,addr into tb from dept where id=:gb_id; dbms_output.put_line('id:' || tb.myid); dbms_output.put_line('name:' || tb.myname); dbms_output.put_line('addr:' || tb.myaddr); exception when NO_DATA_FOUND then dbms_output.put_line('no record is found, occur in inner.'); 内层的错误捕捉到后,外层的错误就不捕捉了。否则由外层捕获错误。 end; exception when TOO_MANY_ROWS then when OTHERS then dbms_output.put_line('too many rows are selected, occur in outer.'); dbms_output.put_line('undefine error'); dbms_output.put_line('error coede: ' || SQLCODE); end; / dbms_output.put_line('error message:' || SQLERRM); 10. if / else 的用法
declare v1 number:=90; begin
if v1=10 then dbms_output.put_line('v1 is 10'); elsif v1=20 then dbms_output.put_line('v2 is 20'); else dbms_output.put_line('v2 is others'); end if; end; /
11. case 的用法
declare v number:=10;
Oracle9i 开发指南:PL/SQL程序设计 清华大学出版社 ISBN 7-302-08002-x
Ben整理 2004年 秋
MSN: mascotzhuang@hotmail.com
begin case :v
when 10 then dbms_output.put_line('v is 10'); when 20 then dbms_output.put_line('v is 20'); else dbms_output.put_line('v is not 10 and 20'); end case; end; /
12. procedure 的建立和调用
create or replace procedure test_sp (test in number, outtest out number) is begin end; / create or replace procedure printsomthing is begin dbms_output.put_line(print); end; / create or replace procedure printsomthing is begin dbms_output.put_line(print); end; / exec test_sp(:test,:outtest); 外部执行的时候注意参数调用方式要加“:” 存储过程可以重载,符合C++的重载规则。 (print in char) (print in number) if test>10 then printsomthing ('test is over 10!!'); begin end; printsomthing (outtest); 过程调用过程的参数调用格式注意,不加“:” 参数的声明不要对它的大小进行定义。IN表示传入的参数,不能修改,OUT表示传出的参数。 else outtest:=test; end if; Oracle9i 开发指南:PL/SQL程序设计 清华大学出版社 ISBN 7-302-08002-x
Ben整理 2004年 秋
MSN: mascotzhuang@hotmail.com
13. function的建立和调用
create or replace function test(t in number) return number is begin if t>10 then elsif t<10 then dbms_output.put_line(t); dbms_output.put_line(t); end if; end; / 注意:调用的方法,不能以procedure那样独立进行调用。函数是表达式的一部分(有返回值)。 exec test(1); 错误 exec :tt:=test(2); 正确 Tips:建议使用return模式,而不是使用out模式。 procedure 中也能用return,这里的return只表示当前procedure的中断。 参数如同procedure一样,不能修改in的参数
create or replace function test(t in number) return number is begin if t>10 then LINE/COL ERROR -------- ----------------------------------------------------------------- 5/3 PLS-00363: 表达式 'T' 不能用作赋值目标 5/3 PL/SQL: Statement ignored t:=t+10; dbms_output.put_line(t); elsif t<10 then dbms_output.put_line(t); end if; return t; end; / 多路return
create or replace function test(t in number) return number is begin
if t<10 then
return 1; elsif t>=10 then return t; Function的建立,需要返回值,但不需要说明大小。 return 2; end if;
Oracle9i 开发指南:PL/SQL程序设计 清华大学出版社 ISBN 7-302-08002-x
Ben整理 2004年 秋
MSN: mascotzhuang@hotmail.com
end; /
function中调用procedure create or replace function test(t in number) return number is begin end; / printnumber(t); return t; create or replace procedure printnumber is begin dbms_output.put_line(print); end; / (print in number) 14. 参数的调用(in 模式为按址调用,out / in out模式为按值调用。NOCOPY 强行转换
成按址调用。
create or replace procedure test_nocopy_sp(p_in in number, p_out in out nocopy number) is begin p_out:=5; if p_in=1 then end; / create or replace procedure run_nocopy_sp is lv_test_num number; begin lv_test_num:=1; test_nocopy_sp(1,lv_test_num); exception 因为test_nocopy_sp这个过程的第二个参数是nocopy的,也就是传址的,所以修改了lv_test_num,为5。 如果test_nocopy_sp这个过程的第二个参数不是nocopy,那么就是传值,lv_test_num不被修改,仍然为1。 raise no_data_found; end if; 强行抛出一个异常,以显示参数的结果。 when others then dbms_output.put_line('error happened' || lv_test_num); / error happened 5 error happened 1
end; Oracle9i 开发指南:PL/SQL程序设计 清华大学出版社 ISBN 7-302-08002-x
Ben整理 2004年 秋
MSN: mascotzhuang@hotmail.com
15. 软件包(package)的建立(包含了函数的重载)
软件包声明 create or replace package test_package is procedure test_sp (test in number, outtest out number); procedure printsomthing (print in number); (print in char); (t in number) return number; end; / 软件包体的建立 create or replace package body test_package is procedure test_sp (test in number, outtest out number) is begin if test>10 then printsomthing ('test is over 10!!'); begin 无begin 函数printsomething的重载 procedure printsomthing function test 只声明过程、函数的原型。 else outtest:=test; printsomthing (test); end; end if; end test_sp; procedure printsomthing (print in number) is begin dbms_output.put_line(print); end printsomthing; procedure printsomthing end 的注意