资源描述:
《存储过程和函数.ppt》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、存储过程、函数主要内容存储过程函数包存储子程序存储子程序是被命名的PL/SQL块,以编译的形式存储在数据库服务器中,可以在应用程序中进行调用,是PL/SQL程序模块化的一种体现。PL/SQL中的存储子程序包括存储过程和(存储)函数两种。创建存储过程图形工具OEM创建CREATE[ORREPLACE]PROCEDURE过程名(参数名in
2、out
3、inout数据类型[:=初始值],参数名in
4、out
5、inout数据类型[:=初始值],…参数名in
6、out
7、inout数据类型[:=初始值])IS
8、AS[<局部变量声明>]BEGIN<过程体>EXCEPTION<异常
9、处理>END[<过程名>];参数的模式IN(默认参数模式)表示当过程被调用时,实参值被传递给形参;在过程内,形参起常量作用,只能读该参数,而不能修改该参数。OUT:在过程内,形参起未初始化的PL/SQL变量的作用,初始值为NULL,可以进行读/写操作。INOUT表示当过程被调用时,实参值被传递给形参;在过程内,形参起已初始化的PL/SQL变量的作用,可读可写。参数的限制在声明形参时,不能定义形参的长度或精度、刻度,它们是作为参数传递机制的一部分被传递的,是由实参决定的。参数传递方式当子程序被调用时,实参与形参之间值的传递方式取决于参数的模式。IN参数为引用传
10、递,即实参的指针被传递给形参;OUT,INOUT参数为值传递,即实参的值被复制给形参。参数默认值可以为参数设置默认值,这样存储过程被调用时如果没有给该参数传递值,则采用默认值。需要注意,有默认值的参数应该放在参数列表的最后。简单存储过程Createorreplaceprocedurep_helloAsBegindbms_output.put_line(‘helloworld!’);End;Createorreplaceprocedureshow_empAsv_salemp.sal%type;beginSELECTavg(sal)INTOv_salFROMem
11、pWHEREdeptno=10;DBMS_OUTPUT.PUT_LINE(
12、'averagesalaryis:'
13、
14、v_sal);FORv_empIN(SELECT*FROMempWHEREdeptno=10ANDsal>v_sal)LOOPDBMS_OUTPUT.PUT_LINE(v_emp.empno
15、
16、''
17、
18、v_emp.ename);ENDLOOP;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thedepartmentdoesn’’texists!');End;带输入参数的存储过程Creat
19、eorreplaceprocedureshow_emp(p_deptnoemp.deptno%type)Asv_salemp.sal%type;beginSELECTavg(sal)INTOv_salFROMempWHEREdeptno=p_deptno;DBMS_OUTPUT.PUT_LINE(
20、'averagesalaryis:'
21、
22、v_sal);FORv_empIN(SELECT*FROMempWHEREdeptno=p_deptnoANDsal>v_sal)LOOPDBMS_OUTPUT.PUT_LINE(v_emp.empno
23、
24、''
25、
26、v_emp
27、.ename);ENDLOOP;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thedepartmentdoesn’’texists!');End;带输出参数的过程CREATEORREPLACEPROCEDUREreturn_deptinfo(p_deptnoemp.deptno%TYPE,p_avgsalOUTemp.sal%TYPE,p_countOUTemp.sal%TYPE)ASBEGINSELECTavg(sal),count(*)INTOp_avgsal,p_countFROMempWHE
28、REdeptno=p_deptno;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE('Thedepartmentdon’’texists!');END;存储过程的调用在sqlplus中调用:execute过程名(参数1,参数2,…)在程序中调用:过程名(参数1,参数2,…);DECLAREv_avgsalemp.sal%TYPE;v_countNUMBER;BEGINshow_emp(20);return_deptinfo(10,v_avgsal,v_count);DBMS_OUTPUT.PUT_LINE
29、(v_avgsal
30、
31、''
32、
33、v_count);EN