《oracle 第15章 PLSQL程序设计.ppt》由会员分享,可在线阅读,更多相关《oracle 第15章 PLSQL程序设计.ppt(192页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Oracle 数据库基础教程2009第第15章章 PL/SQL程序设计程序设计1Oracle 数据库基础教程2007本章内容本章内容pPL/SQL概述pPL/SQL基础p控制结构p游标p异常处理p存储子程序p包p触发器2Oracle 数据库基础教程2007本章要求本章要求p掌握PL/SQL程序设计基础知识p掌握存储过程、函数、包、触发器的应用3Oracle 数据库基础教程200715.1 PL/SQL概述概述pPL/SQL特点pPL/SQL功能特性pPL/SQL执行过程与开发工具4Oracle 数据库基础教程200715.1.1PL/SQL特点特点p与SQL语言紧密集成。p减小网络流量,提高应
2、用程序的运行性能。p模块化的程序设计功能,提高了系统可靠性。p服务器端程序设计,可移植性好。5Oracle 数据库基础教程200715.1.2PL/SQL功能特性功能特性p语句块结构p异常处理p变量和类型p条件语句p循环结构p游标p过程、函数和触发器p包p集合p动态SQLp对象特性6Oracle 数据库基础教程200715.1.3PL/SQL执行过程与开发工具执行过程与开发工具PL/SQL块SQL语句客户端应用程序PL/SQL引擎数据库服务器过程化语句执行器SQL执行器块中SQL语句pPL/SQL执行过程 7Oracle 数据库基础教程2007pPL/SQL开发工具nSQL*PLUSnProc
3、edureBuildernOracleForm、OracleReportsnPL/SQLDeveloper8Oracle 数据库基础教程200715.2 PL/SQL基础基础pPL/SQL程序结构 p词法单元 p数据类型p变量与常量p编译指示pPL/SQL中的SQL语句9Oracle 数据库基础教程2007PL/SQL程序结构程序结构pPL/SQL块的组成pPL/SQL块分类 10Oracle 数据库基础教程2007pPL/SQL块的组成nPL/SQL语言以块为单位,块中可以嵌套子块。语言以块为单位,块中可以嵌套子块。n一个基本的一个基本的PL/SQL块由块由3部分组成:部分组成:p声明(DE
4、CLARE),p可执行部分(BEGIN),p异常处理部分EXCEPTION)。n11Oracle 数据库基础教程2007p声明部分n声明部分以关键字DECLARE开始,BEGIN结束。主要用于声明变量、常量、数据类型、游标、异常处理名称以及本地(局部)子程序定义等。p可执行部分n执行部分是PL/SQL块的功能实现部分,以关键字BEGIN开始,EXCEPTION或END结束(如果PL/SQL块中没有异常处理部分,则以END结束)。该部分通过变量赋值、流程控制、数据查询、数据操纵、数据定义、事务控制、游标处理等实现块的功能。p异常处理部分n异常处理部分以关键字异常处理部分以关键字EXCEPTION
5、开始,开始,END结束。该部分用结束。该部分用于处理该块执行过程中产生的异常。于处理该块执行过程中产生的异常。12Oracle 数据库基础教程2007p注意:n执行部分是必需的,而声明部分和异常部分是执行部分是必需的,而声明部分和异常部分是可选的;可选的;n可以在一个块的执行部分或异常处理部分嵌套可以在一个块的执行部分或异常处理部分嵌套其他的其他的PL/SQL块;块;n所有的所有的PL/SQL块都是以块都是以“END;”结束结束13Oracle 数据库基础教程2007pPL/SQL块分类n匿名块匿名块n命名块命名块p函数p存储过程p包p触发器14Oracle 数据库基础教程200715.5.2
6、15.5.2词法单元词法单元p字符集p标识符p分隔符p常量值p注释15Oracle 数据库基础教程2007p字符集n大小写字母:大小写字母:AZAZ,azazn数字:数字:0909n空白:制表符、空格和回车空白:制表符、空格和回车n数字符号:数字符号:+-*/+-*/=n标点符号:标点符号:!#$%&*()()_|?;:,.“16Oracle 数据库基础教程2007p标识符n标标识识符符以以字字母母开开头头,后后边边可可以以跟跟字字母母、数数字字、货币符号、下划线和货币符号、下划线和”#”#”n标标识识符符的的最最大大长长度度为为3030字字符符,并并且且所所有有字字符符都都是有效的。是有效的
7、。p合法:X v_studentID TempVarp非法:X+y _temp 17Oracle 数据库基础教程2007p+p-p*p/p=p:=pp=pp!=p=p=p(p)p/*p*/pp%p;p:p.pp“p.pp|p=p*p-p分隔符分隔符18Oracle 数据库基础教程2007p常量值n字符型常量字符型常量n数字型常量数字型常量n布尔型常量:布尔型常量:TURE、FALSE、NULLn日期型常量日期型常量19Oracle 数据库基础教程200715.2.3数据类型数据类型p数字类型p字符类型p日期/区间类型p行标识类型p布尔类型p原始类型pLOB类型p记录类型p集合类型20Oracl
8、e 数据库基础教程2007PL/SQL中常用的基本数据类型分类数据类型数字类型NUMBER、BINARY_NUMBER PLS_NUMBER字符类型VARCHAR2、CHAR、LONG、NCHAR、NVARCHAR日期/区间类型 DATE、TIMESTAMP、INTERVAL行标识类型ROWID、UROWID布尔类型BOOLEAN(TRUE、FALSE、NULL)原始类型RAW、LONG RAWLOB类型CLOB、BLOB、NCLOB、BFILE记录类型RECORD集合类型TABLE、VARRAY21Oracle 数据库基础教程2007p记录类型的定义nTYPErecord_typeISREC
9、ORD(nfield1datatype1NOTNULLDEFAULT|:=expr1,nfield2datatype2NOTNULLDEFAULT|:=expr2,nnfieldndatatypenNOTNULLDEFAULT|:=exprn);22Oracle 数据库基础教程200715.2.415.2.4变量与常量变量与常量p变量与常量的定义p变量的作用域23Oracle 数据库基础教程2007变量声明变量与常量的定义变量与常量的定义p变量定义的一般格式:n CONSTANT NOT NULL DEFAULT|:=;p说明n每行只能定义一个标识符。n如果加上关键字CONSTANT,则表示所
10、定义的标识符为一个常量,必须为它赋初值。n如果定义的标识符不能为空,则必须加上关键字NOT NULL,并赋初值。n为标识符赋值时,使用赋值符号:=,默认值为空。24Oracle 数据库基础教程2007pDECLAREp v1 NUMBER(4);p v2 NUMBER(4)NOT NULL:=10;p v3 CONSTANT NUMBER(4)DEFAULT 100;pBEGINp IF v1 IS NULL THEN p DBMS_OUTPUT.PUT_LINE(V1 IS NULL!);p END IF;p DBMS_OUTPUT.PUT_LINE(v2|v3);pEND;25Oracle
11、 数据库基础教程2007p声明一个变量,使它的类型与某个变量或声明一个变量,使它的类型与某个变量或数据库基本表中某个列的数据类型一致,数据库基本表中某个列的数据类型一致,可以使用可以使用%TYPE。p示例示例nv_empno1 emp.empno%TYPE;nv_empno2 v_empno1%TYPE;26Oracle 数据库基础教程2007变量的作用域变量的作用域p变量的作用域是指变量的有效作用范围,从变量声明开始,直到块结束。p如果PL/SQL块相互嵌套,则在内部块中声明的变量是局部的,只能在内部块中引用,而在外部块中声明的变量是全局的,既可以在外部块中引用,也可以在内部块中引用。p如果
12、内部块与外部块中定义了同名变量,则在内部块中引用外部块的全局变量时需要使用外部块名进行标识。27Oracle 数据库基础教程2007ppDECLAREp v_ename CHAR(15);p v_outer NUMBER(5);pBEGINp v_outer:=10;p DECLAREp v_ename CHAR(20);p v_inner DATE;p BEGINp v_inner:=sysdate;p v_ename:=INNER V_ENAME;p OUTER.v_ename:=OUTER V_ENAME;p END;p DBMS_OUTPUT.PUT_LINE(v_ename);pEN
13、D;28Oracle 数据库基础教程200715.2.5编译指示编译指示p编译指示是对编译程序发出的特殊指令,也称伪指令。n关键字:关键字:PRAGMApPL/SQL提供以下四种编译指示:nEXCEPTION_INITp告诉编译程序将一个特定的错误号与程序中所声明的异常标识符关联起来。nRESTRICT_REFERENCESp告诉编译程序打包程序的纯度,即对函数中可以使用的SQL语句和包变量进行限制。29Oracle 数据库基础教程2007nSERIALLY_REUSEABLEp告诉PL/SQL运行时引擎,在数据引用之间不要保持包级数据。nAUTONOMOUS_TRANSACTIONp告诉编译
14、程序,该程序块为自治事务,即该事务的提交和回滚是独立进行的。30Oracle 数据库基础教程200715.2.6PL/SQL中中SQL语句语句p可以在PL/SQL中执行的SQL语句包括nSELECTnDML(UPDATE、DELETE、INSERT)n事务控制语句(事务控制语句(COMMIT、ROLLBACK、SAVEPOINT)p注意DDL语句不可以直接使用31Oracle 数据库基础教程2007pSELECTINTOnSELECTINTO语句只能查询一个记录的信语句只能查询一个记录的信息,如果没有查询到任何数据,则会产生息,如果没有查询到任何数据,则会产生NO_DATA_FOUND异常;如
15、果查询到多个异常;如果查询到多个记录,则会产生记录,则会产生TOO_MANY_ROW异常。异常。nINTO句子后的变量用于接收查询的结果,变句子后的变量用于接收查询的结果,变量的个数、顺序应该与查询的目标数据相匹配,量的个数、顺序应该与查询的目标数据相匹配,也可以是记录类型的变量。也可以是记录类型的变量。DML语句语句32Oracle 数据库基础教程2007pDECLAREpv_emp emp%ROWTYPE;p v_ename emp.ename%type;p v_sal emp.sal%type;pBEGINpSELECT*INTO v_emp FROM emp WHERE ename=S
16、MITH;p DBMS_OUTPUT.PUT_LINE(v_emp.empno|v_emp.sal);p select ename,sal INTO v_ename,v_sal FROM emp WHERE empno=7900;p DBMS_OUTPUT.PUT_LINE(v_ename|v_sal);pEND;33Oracle 数据库基础教程2007pDML语句nPL/SQL中中DML语句对标准语句对标准SQL语句中的语句中的DML语句语句进行了扩展,允许使用变量。进行了扩展,允许使用变量。p 示例nDECLAREnv_empnoemp.empno%TYPE:=7500;nBEGINnIN
17、SERTINTOemp(empno,ename,sal,deptno)VALUES(v_empno,JOAN,2300,20);nUPDATEempSETsal=sal+100WHEREempno=v_empno;nDELETEFROMempWHEREempno=v_empno;nEND;34Oracle 数据库基础教程2007pWHEREn标识符的区分标识符的区分p系统首先查看WHERE子句中的标识符是否与表中的列名相同,如果相同,则该标识符被解释为列名;如果没有同名列,系统检查该标识符是不是PL/SQL语句块的变量。n字符串比较字符串比较p填充比较:通过在短字符串后添加空格,使两个字符串达
18、到相同长度,然后根据每个字符的ASCII码进行比较。p非填充比较:根据每个字符的ASCII码进行比较,最先结束的字符串为小。nPL/SQL中规定,对定长的字符串(中规定,对定长的字符串(CHAR类型的字类型的字符串和字符串常量)采用填充比较;如果比较的字符符串和字符串常量)采用填充比较;如果比较的字符串中有一个是变长字符串(串中有一个是变长字符串(VARCHAR2类型的字符类型的字符串),则采用非填充比较。串),则采用非填充比较。35Oracle 数据库基础教程2007pRETURNINGn如果要查询当前如果要查询当前DML语句操作的记录的信息,语句操作的记录的信息,可以在可以在DML语句末尾
19、使用语句末尾使用RETURNING语语句返回该记录的信息。句返回该记录的信息。nRETURNING语句的基本语法语句的基本语法:pRETURNING select_list_item INTO variable_list|record_variable;36Oracle 数据库基础教程2007nDECLAREn v_sal emp.sal%TYPE;nBEGINn UPDATE emp SET sal=sal+100 WHERE empno=7844 RETURNING sal INTO v_sal;n DBMS_OUTPUT.PUT_LINE(v_sal);nEND;37Oracle 数据库
20、基础教程200715.3 15.3 控制结构控制结构 p选择结构p循环结构p跳转结构38Oracle 数据库基础教程200715.3.1选择结构选择结构pIF语句语句nIF condition1 THEN statements1;nELSIF condition2 THEN statements2;nnELSE else_statements;nEND IF;p注意注意n条件是一个布尔型变量或表达式,取值只能是TRUE,FALSE,NULL。39Oracle 数据库基础教程2007p例如,输入一个员工号,修改该员工的工资,如果该员工为10号部门,工资增加100;若为20号部门,工资增加150;
21、若为30号部门,工资增加200;否则增加300。40Oracle 数据库基础教程2007pDECLAREpv_deptno emp.deptno%type;p v_increment NUMBER(4);p v_empno emp.empno%type;pBEGINp v_empno:=&x;p SELECT deptno INTO v_deptno FROM emp WHERE empno=v_empno;p IF v_deptno=10 THEN v_increment:=100;p ELSIF v_deptno=20 THEN v_increment:=150;p ELSIF v_dep
22、tno=30 THEN v_increment:=200;p ELSE v_increment:=300;p END IF;p UPDATE emp SET sal=sal+v_increment WHERE empno=v_empno;pEND;41Oracle 数据库基础教程2007搜索式搜索式CASE语句语句p基本语法基本语法nCASEnWHENcondition1THENstatements1;nWHENcondition2THENstatements2;nnWHENconditionnTHENstatementsn;nELSEelse_statements;nENDCASE;42Or
23、acle 数据库基础教程2007等值比较的等值比较的CASE语句语句p基本语法基本语法nCASEtest_valuenWHENvalue1THENstatements1;nWHENvalue2THENstatements2;nnWHENvaluenTHENstatementsn;nELSEelse_statements;nENDCASE;43Oracle 数据库基础教程2007pDECLAREp v_deptno emp.deptno%type;p v_increment NUMBER(4);p v_empno emp.empno%type;pBEGINp v_empno:=&x;p SELE
24、CT deptno INTO v_deptno FROM emp WHERE empno=v_empno;p CASE v_deptno p WHEN 10 THEN v_increment:=100;p WHEN 20 THEN v_increment:=150;p WHEN 30 THEN v_increment:=200;p ELSE v_increment:=300;pEND CASE;pUPDATE emp SET sal=sal+v_increment WHERE empno=v_empno;pEND;44Oracle 数据库基础教程2007p根据输入的员工号,修改该员工工资。如果
25、该员工工资低于1000,则工资增加200;如果工资在1000-2000之间,则增加150;如果工资在2000-3000之间,则增加100;否则增加50。45Oracle 数据库基础教程2007pDECLAREpv_sal emp.sal%type;pv_increment NUMBER(4);pv_empno emp.empno%type;pBEGINpv_empno:=&x;pSELECT sal INTO v_sal FROM emp WHERE empno=v_empno;pCASE p WHEN v_sal1000 THEN v_increment:=200;p WHEN v_sal2
26、000 THEN v_increment:=150;p WHEN v_sal 50;p END LOOP;pEND;49Oracle 数据库基础教程2007WHILE循环循环p基本语法 WHILE condition LOOP sequence_of_statement;END LOOP;50Oracle 数据库基础教程2007p例如,利用WHILE循环向temp_table表中插入50条记录。程序为:pDECLAREp v_counter BINARY_INTEGER:=1;pBEGINp WHILE v_counter=50 LOOPp INSERT INTO temp_table VAL
27、UES(v_counter,Loop index);p v_counter:=v_counter+1;p END LOOP;pEND;51Oracle 数据库基础教程2007FOR循环循环p基本语法 FOR loop_counter IN REVERSE low_bound.high_bound LOOP sequence_of_statement;END LOOP;p注意:n循环变量不需要显式定义,系统隐含地将它声明为循环变量不需要显式定义,系统隐含地将它声明为BINARY_INTEGERBINARY_INTEGER变量;变量;n系统默认时,循环变量从下界往上界递增计数,如果系统默认时,循环
28、变量从下界往上界递增计数,如果使用使用REVERSEREVERSE关键字,则表示循环变量从上界向下界递关键字,则表示循环变量从上界向下界递减计数;减计数;n循环变量只能在循环体中使用,不能在循环体外使用。循环变量只能在循环体中使用,不能在循环体外使用。52Oracle 数据库基础教程2007p例如,利用FOR循环向temp_table表中插入50条记录。程序为:pBEGINp FOR v_counter IN 1.50 LOOPp INSERT INTO temp_table VALUES(v_counter,Loop Index);p END LOOP;pEND;53Oracle 数据库基础
29、教程200715.3.3跳转结构跳转结构n语法格式:标号标号GOTO标号;标号;n说明:p块内可以跳转,内层块可以跳到外层块,但外层块不块内可以跳转,内层块可以跳到外层块,但外层块不能跳到内层。能跳到内层。pIF语句不能跳入。不能从循环体外跳入循环体内。语句不能跳入。不能从循环体外跳入循环体内。不能从子程序外部跳到子程序中。不能从子程序外部跳到子程序中。p由于由于goto语句的缺点,建议尽量少用甚至不用语句的缺点,建议尽量少用甚至不用goto语句。语句。54Oracle 数据库基础教程200715.4 15.4 游标游标p游标的概念及类型 p显式游标 p隐式游标55Oracle 数据库基础教程
30、2007pDECLAREp v_counter BINARY_INTEGER:=1;pBEGINp p INSERT INTO temp_table p VALUES(v_counter,Loop index);p v_counter:=v_Counter+1;p IF v_counter6000 THEN p RAISE e_highlimit;p END IF;pEXCEPTIONp WHEN e_highlimit THENp DBMS_OUTPUT.PUT_LINE(The salary is too large!);p ROLLBACK;pEND;100Oracle 数据库基础教程2
31、007OTHERS异常处理器异常处理器pOTHERS异常处理器是一个特殊的异常处理器,可以捕获所有的异常。p通常,OTHERS异常处理器总是作为异常处理部分的最后一个异常处理器,负责处理那些没有被其他异常处理器捕获的异常。101Oracle 数据库基础教程2007pDECLAREp v_sal emp.sal%TYPE;p e_highlimit EXCEPTION;pBEGINp SELECT sal INTO v_sal FROM emp WHERE ename=JOAN;p UPDATE emp SET sal=sal+100 WHERE empno=7900;p IF v_sal600
32、0 THEN p RAISE e_highlimit;p END IF;pEXCEPTIONp WHEN e_highlimit THENp DBMS_OUTPUT.PUT_LINE(The salary is too large!);p ROLLBACK;p WHEN OTHERS THENp DBMS_OUTPUT.PUT_LINE(There is some wrong in selecting!);pEND;102Oracle 数据库基础教程2007p可以通过两个函数来获取错误相关信息。nSQLCODE:返回当前错误代码。返回当前错误代码。p如果是用户定义错误返回值为1;p如果是ORA
33、-1403:NO DATA FOUND错误,返回值为100;p其他Oracle内部错误返回相应的错误号。nSQLERRM:返回当前错误的消息文本。返回当前错误的消息文本。p如果是Oracle内部错误,返回系统内部的错误描述;p如果是用户定义错误,则返回信息文本为“User-defined Exception”。103Oracle 数据库基础教程2007pDECLAREp v_sal emp.sal%TYPE;p e_highlimit EXCEPTION;p v_code NUMBER(6);p v_text VARCHAR2(200);pBEGINp SELECT sal INTO v_sa
34、l FROM emp WHERE ename=JOAN;p UPDATE emp SET sal=sal+100 WHERE empno=7900;p IF v_sal6000 THEN p RAISE e_highlimit;p END IF;pEXCEPTIONp WHEN e_highlimit THENp DBMS_OUTPUT.PUT_LINE(The salary is too large!);p ROLLBACK;p WHEN OTHERS THENp v_code:=SQLCODE;p v_text:=SQLERRM;p DBMS_OUTPUT.PUT_LINE(v_code|
35、v_text);pEND;104Oracle 数据库基础教程200715.5.3异常的传播异常的传播p可执行部分异常的传播n如果当前语句块有该异常的处理器,则执行如果当前语句块有该异常的处理器,则执行之,并且成功完成该语句块。然后,控制权之,并且成功完成该语句块。然后,控制权传递到外层语句块。传递到外层语句块。n如果当前语句块没有该异常的处理器,则通如果当前语句块没有该异常的处理器,则通过在外层语句块中产生该异常来传播该异常。过在外层语句块中产生该异常来传播该异常。然后,执行对外层语句块执行步骤然后,执行对外层语句块执行步骤1。如果。如果没有外层语句块,则该异常将传播到调用环没有外层语句块,则
36、该异常将传播到调用环境。境。105Oracle 数据库基础教程2007pDECLAREp v_sal emp.sal%TYPE;pBEGINp BEGIN p SELECT sal INTO v_sal FROM emp WHERE ename=JOAN;p EXCEPTIONp WHEN NO_DATA_FOUND THEN p DBMS_OUTPUT.PUT_LINE(There is not such an employee!);p END;p DBMS_OUTPUT.PUT_LINE(Now this is outputted by outer block!);pEND;p/pTher
37、e is not such an employee!pNow this is outputted by outer block!106Oracle 数据库基础教程2007pDECLAREp v_sal emp.sal%TYPE;pBEGINp BEGIN p SELECT sal INTO v_sal FROM emp WHERE deptno=10;p EXCEPTIONp WHEN NO_DATA_FOUND THEN p DBMS_OUTPUT.PUT_LINE(There is not such an employee!);p END;p DBMS_OUTPUT.PUT_LINE(No
38、w this is outputted by outer block!);pEXCEPTIONp WHEN TOO_MANY_ROWS THENp DBMS_OUTPUT.PUT_LINE(There are more than one employee!);pEND;p/pThere are more than one employee!107Oracle 数据库基础教程2007p声明部分异常的传播n声明部分的异常立刻传播到外层语句块,即声明部分的异常立刻传播到外层语句块,即使当前语句块有异常处理器。使当前语句块有异常处理器。p异常处理部分的异常的传播n异常处理器中产生的异常,可以有异常处理
39、器中产生的异常,可以有RAISE语句显式产生,也可以通过运行时错误而隐语句显式产生,也可以通过运行时错误而隐含产生。异常立即被传播到外层语句块。含产生。异常立即被传播到外层语句块。108Oracle 数据库基础教程2007pBEGINp DECLAREpv_number NUMBER(6):=ABC;pBEGINp v_number:=10;p EXCEPTIONp WHEN OTHERS THENp DBMS_OUTPUT.PUT_LINE(This is outputted by inner block!);p END;pEXCEPTIONpWHEN OTHERS THENp DBMS_O
40、UTPUT.PUT_LINE(This is outputted by outer block!);pEND;p/pThis is outputted by outer block!109Oracle 数据库基础教程200715.6 存储子程序存储子程序p存储过程p函数p局部子程序110Oracle 数据库基础教程2007p存储子程序是指被命名的PL/SQL块,以编译的形式存储在数据库服务器中,可以在应用程序中进行调用,是PL/SQL程序模块化的一种体现。p存储子程序是以独立对象的形式存储在数据库服务器中,因此是一种全局结构,与之对应的是局部子程序,即嵌套在PL/SQL块中的局部过程和函数,其
41、存储位置取决于其所在的父块的位置。111Oracle 数据库基础教程2007存储过程存储过程p存储过程的创建p存储过程的调用p存储过程的管理112Oracle 数据库基础教程2007存储过程的创建存储过程的创建pCREATE OR REPLACE PROCEDURE procedure_namep(parameter1_name mode datatype DEFAULT|:=valuep,parameter2_name mode datatype DEFAULT|:=value,)pAS|ISp /*Declarative section is here*/pBEGINp /*Executa
42、ble section is here*/pEXCEPTIONp /*Exception section is here*/pENDprocedure_name;PROCEDURE BODY113Oracle 数据库基础教程2007p参数模式nIN 当过程被调用时,实参值被传递给过程。在过程内,该参数起常数 作用,可读不可写。调用结束,实参值不变。(默认参数类型)nOUT 当过程被调用时,实参值被忽略。在过程内,该参数起未初始化的变量作用,值为NULL。过程内,该参数可读可写。调用结束,形参赋给实参。nINOUT 当过程被调用时,实参值被传递给过程。在过程内,该参数起已初始化变量作用,过程内,
43、该参数可读可写。调用结束,形参赋给实参。114Oracle 数据库基础教程2007p参数限制n声明形参时不能定义形参的长度或精度、刻度声明形参时不能定义形参的长度或精度、刻度p参数传递nIN参数为引用传递,即实参的指针被传递给形参数为引用传递,即实参的指针被传递给形参;参;nOUT、INOUT参数为值传递,即实参的值被参数为值传递,即实参的值被复制给形参。复制给形参。115Oracle 数据库基础教程2007p创建一个存储过程,以部门号为参数,查询该部门的平均工资,并输出该部门中比平均工资高的员工号、员工名。pCREATE OR REPLACE PROCEDURE show_emp(pp_de
44、ptno emp.deptno%TYPE)pASp v_sal emp.sal%TYPE;pBEGINpSELECT avg(sal)INTO v_sal FROM emp WHERE deptno=p_deptno;pDBMS_OUTPUT.PUT_LINE(p_deptno|average salary is:|v_sal);pFOR v_emp IN(SELECT*FROM emp WHERE deptno=p_deptno AND salv_sal)LOOPp DBMS_OUTPUT.PUT_LINE(v_emp.empno|v_emp.ename);pEND LOOP;pEXCEPT
45、IONp WHEN NO_DATA_FOUND THENp DBMS_OUTPUT.PUT_LINE(The department doesnt exists!);pEND show_emp;116Oracle 数据库基础教程2007p通常,存储过程不需要返回值,如果需要返回一个值可以通过函数调用实现。但是,如果希望返回多个值,可以使用OUT或IN OUT模式参数来实现。117Oracle 数据库基础教程2007p创建一个存储过程,以部门号为参数,返回该部门的人数和最高工资。pCREATE OR REPLACE PROCEDURE return_deptinfo(pp_deptno emp.d
46、eptno%TYPE,pp_avgsal OUT emp.sal%TYPE,pp_count OUT emp.sal%TYPE)pASpBEGINp SELECT avg(sal),count(*)INTO p_avgsal,p_count p FROM emp p WHERE deptno=p_deptno;pEXCEPTIONp WHEN NO_DATA_FOUND THENp DBMS_OUTPUT.PUT_LINE(The department dont exists!);pEND return_deptinfo;118Oracle 数据库基础教程2007存储过程的调用存储过程的调用p
47、在SQL*PLUS中调用nEXEC procedure_name(parameter_list)nEXECUTE show_emp(10)p在PL/SQL块中调用nBEGIN procedure_name(parameter_list);nEND;119Oracle 数据库基础教程2007pDECLAREp v_avgsal emp.sal%TYPE;p v_count NUMBER;pBEGINp show_emp(20);p return_deptinfo(10,v_avgsal,v_count);p DBMS_OUTPUT.PUT_LINE(v_avgsal|v_count);pEND;
48、120Oracle 数据库基础教程2007存储过程的管理存储过程的管理p修改存储过程nCREATE OR REPLACE PROCEDURECREATE OR REPLACE PROCEDUREp重新编译存储过程nALTER PROCEDURE ALTER PROCEDURE procedure_nameprocedure_name COMPILE COMPILE;p删除存储过程nDROP PROCEDURE DROP PROCEDURE procedure_nameprocedure_name名;名;p查看过程源代码nselecttextfromuser_sourcewherename=pr
49、ocedure_nameprocedure_name;121Oracle 数据库基础教程200715.6.2函数函数p函数概述p函数的创建p函数的调用p函数的管理122Oracle 数据库基础教程2007函数概述函数概述p函数用于返回特定数据,可以返回一个或多个值。p在一个函数中必须包含一个或多个RETURN 语句p函数调用是PL/SQL表达式的一部分,而过程调用可以是一个独立的PL/SQL语句 123Oracle 数据库基础教程2007函数的创建函数的创建CREATE OR REPLACE FUNCTION function_name(parameter1_name mode datatyp
50、e DEFAULT|:=value,parameter2_name mode datatype DEFAULT|:=value,)RETURN return_datatype AS|IS /*Declarative section is here*/BEGIN /*Executable section is here*/EXCEPTION /*Exception section is here*/END function_name;FUNCTION BODY124Oracle 数据库基础教程2007p创建一个以部门号为参数,返回该部门最高工资的函数。pCREATE OR REPLACE FUN