oracle子程序和程序包课件.ppt
第七章,子程序和程序包,第七章子程序和程序包,回顾,游标用于处理查询结果集中的数据游标类型有:隐式游标、显式游标和 REF 游标隐式游标由 PL/SQL 自动定义、打开和关闭显式游标用于处理返回多行的查询显式游标可以删除和更新活动集中的行要处理结果集中所有记录时,可使用循环游标在声明 REF 游标时,不需要将 SELECT 语句与 其关联,回顾游标用于处理查询结果集中的数据,目标,了解和使用子程序 了解和使用程序包,目标了解和使用子程序,子程序 2-1,命名的 PL/SQL 块,编译并存储在数据库中。子程序的各个部分:声明部分可执行部分异常处理部分(可选)子程序的分类:过程 执行某些操作函数 执行操作并返回值,子程序 2-1命名的 PL/SQL 块,编译并存储在数据库中,子程序 2-2,子程序的优点:模块化将程序分解为逻辑模块可重用性可以被任意数目的程序调用可维护性简化维护操作安全性通过设置权限,使数据更安全,子程序 2-2子程序的优点:,过程 8-1,过程是用于完成特定任务的子程序 例如:,前往售票厅,询问关于车票的信息,排队等候,在柜台购买车票,过程 8-1过程是用于完成特定任务的子程序 前往售票厅询问关,过程 8-2,创建过程的语法:CREATE OR REPLACE PROCEDURE ()IS|AS BEGIN EXCEPTION END;,创建过程,可指定运行过程需传递的参数,处理异常,包括在过程中要执行的语句,过程 8-2创建过程的语法:创建过程,可指定运行过程需传递的,过程 8-3,create or replace procedure test4(v_id varchar2)is v_ename emp.ename%type; v_sal emp.sal%type;begin select ename, sal into v_ename,v_sal from emp where empno=v_id; dbms_output.put_line(v_ename| |v_sal); end;,过程 8-3create or replace proced,过程 8-4,执行过程的语法: EXECUTE procedure_name(parameters_list);,SQL SET SERVEROUTPUT ONSQL EXEC proc_stu(007);,过程 8-4执行过程的语法:SQL SET SERVERO,过程 8-5,过程参数的三种模式:IN用于接受调用程序的值默认的参数模式OUT用于向调用程序返回值 IN OUT用于接受调用程序的值,并向调用程序返回更新的值,过程 8-5过程参数的三种模式:,过程 8-6,create or replace procedure test5( x in number, y in number, z out number)as begin z:=x+y;end;,过程 8-6create or replace proced,过程 8-7,create or replace procedure test6( a in out number, b in out number)is begin dbms_output.put_line(a); dbms_output.put_line(b); a:=100; b:=100;end;,SQL SET SERVEROUT ONSQL declare num1 number := 100; num2 number := 500;begin p_swap(num1,num2); dbms_output.put_line(num1=|num1); dbms_output.put_line(num2=|num2);end;/,过程 8-7create or replace proced,过程 8-8,将过程的执行权限授予其他用户:删除过程:,SQL GRANT EXECUTE ON proc_stu TO SCTOO;SQL GRANT EXECUTE ON proc_swap TO PUBLIC;,SQL DROP PROCEDURE proc_swap;,过程 8-8将过程的执行权限授予其他用户:SQL GRAN,函数 4-1,函数是可以返回值的命名的 PL/SQL 子程序。 创建函数的语法: CREATE OR REPLACE FUNCTION (param1,param2)RETURN IS|AS local declarationsBEGIN Executable Statements; RETURN result;EXCEPTION Exception handlers;END;,函数 4-1函数是可以返回值的命名的 PL/SQL 子程序。,函数 4-2,定义函数的限制:函数只能接受 IN 参数,而不能接受 IN OUT 或 OUT 参数形参不能是 PL/SQL 类型函数的返回类型也必须是数据库类型访问函数的两种方式:使用 PL/SQL 块使用 SQL 语句,函数 4-2定义函数的限制:,函数 4-3,创建函数:查看函数:var name varchar2;exec :name:=funl(函数名字)从 SQL 语句调用函数:,CREATE OR REPLACE FUNCTION func_hello RETURN VARCHAR2ISBEGIN RETURN 朋友,您好;END;/,SQL SELECT func_hello FROM DUAL;,函数 4-3创建函数:CREATE OR REPLACE F,函数 4-4,create or replace function get_sal(v_ename in varchar2)return numberis v_sal number;begin select sal into v_sal from emp where upper(ename)=upper(v_ename); return v_sal;exception when no_data_found then raise_application_error(-20000,员工不存在);end;,函数 4-4create or replace functi,过程和函数的比较,过程和函数的比较过 程函 数作为 PL/SQL 语句执行作,程序包,程序包是对相关过程、函数、变量、游标和异常等对象的封装程序包由规范和主体两部分组成,声明程序包中公共对象。包括类型、变量、常量、异常、游标规范和子程序规范等,声明程序包私有对象和实现在包规范中声明的子程序和游标,程序包,规范,主体,程序包程序包是对相关过程、函数、变量、游标和异常等对象的封装,创建程序包 2-1,程序包规范CREATE OR REPLACE PACKAGE package_name IS|ASPublic item declarationsSubprogram specificationEND package_name;,程序包主体CREATE OR REPLACE PACKAGE BODY package_name IS|ASPrivate item declarationsSubprogram bodiesBEGINInitializationEND package_name;,创建程序包 2-1程序包规范程序包主体,创建程序包 2-2,create or replace package pack_stu As v_globalid char(8); procedure proc_stu(v_id varchar2); function func_stu(v_id varchar2) return varchar2;end pack_stu;/,create or replace package body pack_stu Asprocedure proc_stu(v_id varchar2)Is v_name t_student.f_name%type; v_dept t_student.f_department%type; v_class t_student.f_class%type;begin v_globalid := v_id; select f_name,f_department,f_class into v_name,v_dept,v_class from t_student where f_id=v_id; .end proc_stu;function func_stu(v_id varchar2)return varchar2 As .end func_stu;end pack_stu;/,创建程序包 2-2create or replace pac,程序包的优点,模块化更轻松的应用程序设计信息隐藏新增功能性能更佳,程序包的优点模块化,程序包中的游标 2-1,游标的定义分为游标规范和游标主体两部分在包规范中声明游标规范时必须使用 RETURN 子句指定游标的返回类型RETURN子句指定的数据类型可以是:用 %ROWTYPE 属性引用表定义的记录类型程序员定义的记录类型,程序包中的游标 2-1游标的定义分为游标规范和游标主体两部分,程序包中的游标 2-2,SQL CREATE OR REPLACE PACKAGE pack_cur As Cursor cur_stu(stuclass number) return t_student%rowtype; procedure proc_stu(stuclass number);end;/,SQL CREATE OR REPLACE PACKAGE BODY pack_cur ASCursor cur_stu(stuclass number) return t_student%rowtype Isselect * from t_student where f_class = stuclass;procedure proc_stu(stuclass number)As rec_stu t_student%rowtype;begin Open cur_stu(stuclass); loop Fetch cur_stu Into rec_stu; Exit when cur_stu%NotFound; dbms_output.put_line(学生姓名:|rec_stu.f_name); end loop;end proc_stu;end;/,程序包中的游标 2-2SQL CREATE OR REPL,有关子程序和程序包的信息,USER_OBJECTS 视图包含用户创建的子程序和程序包的信息USER_SOURCE 视图存储子程序和程序包的源代码,SELECT object_name, object_typeFROM USER_OBJECTSWHERE object_type IN (PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY);,SELECT line, text FROM USER_SOURCEWHERE NAME = PACK_CUR;,有关子程序和程序包的信息USER_OBJECTS 视图包含用,总结,子程序是命名的 PL/SQL 块,可带参数并可在需要时随时调用有两种类型的PL/SQL子程序,即过程和函数过程用户执行特定的任务,函数用于执行任务并返回值程序包是对相关类型、变量、常量、游标、异常、过程和函数等对象的封装程序包由两部分组成,即包规范和包主体使用程序包的优点是:模块化、更轻松的程序设计、信息隐藏、新增功能以及性能更佳,总结子程序是命名的 PL/SQL 块,可带参数并可在需要时随,