• / 29
  • 下载费用:10 金币  

oracle学习第七讲-子程序和程序包.pptx

关 键 词:
oracle 学习 第七 子程序 程序包
资源描述:
第七章,子程序和程序包,回顾,游标用于处理查询结果集中的数据游标类型有:隐式游标、显式游标和 REF 游标隐式游标由 PL/SQL 自动定义、打开和关闭显式游标用于处理返回多行的查询显式游标可以删除和更新活动集中的行要处理结果集中所有记录时,可使用循环游标在声明 REF 游标时,不需要将 SELECT 语句与 其关联,2,目标,创建和使用子程序 (重点)----------------------------------创建和使用程序包(重点),3,专业英语,Package包裹, 包Body身体,人,尸体,主要部分, 大量Pragmatic国事的, 团体事务的, 实际的Autonomous自治的Transaction处理, 会报, 交易, 事务, 处理事务,4,子程序 2-1,命名的 PL/SQL 块,编译并存储在数据库中。子程序的各个部分:声明部分可执行部分异常处理部分(可选)子程序的分类:过程 - 执行某些操作函数 - 执行操作并返回值,5,子程序 2-2,子程序的优点:模块化将程序分解为逻辑模块可重用性可以被任意数目的程序调用可维护性简化维护操作安全性通过设置权限,使数据更安全,6,过程 8-1,过程是用于完成特定任务的子程序 例如:,7,前往售票厅,询问关于车票的信息,排队等候,在柜台购买车票,,过程 8-2,创建过程的语法:CREATE [OR REPLACE] PROCEDURE [()]IS|AS BEGIN [EXCEPTION ]END;,8,,创建过程,可指定运行过程需传递的参数,,,处理异常,包括在过程中要执行的语句,过程 8-3,9,CREATE OR REPLACE PROCEDURE find_emp(emp_no NUMBER)AS empname VARCHAR2(20);BEGIN SELECT ename INTO empname FROM EMP WHERE empno = emp_no; DBMS_OUTPUT.PUT_LINE('雇员姓名是 '|| empname);EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('雇员编号未找到');END find_emp;/,,,,过程 8-4,过程参数的三种模式:IN用于接受调用程序的值默认的参数模式OUT用于向调用程序返回值 IN OUT用于接受调用程序的值,并向调用程序返回更新的值,10,过程 8-5,执行过程的语法: EXECUTE procedure_name(parameters_list);,11,SQL> CREATE OR REPLACE PROCEDURE itemdesc(item_code IN VARCHAR2)IS v_itemdesc VARCHAR2(5);BEGIN SELECT itemdesc INTO v_itemdesc FROM itemfile WHERE itemcode = item_code; DBMS_OUTPUT.PUT_LINE(item_code|| '项目的说明为'||v_itemdesc);END;/SQL> SET SERVEROUTPUT ONSQL> EXECUTE itemdesc('i201');,,,过程 8-6,12,SQL> CREATE OR REPLACE PROCEDURE test( value1 IN VARCHAR2, value2 OUT NUMBER )IS identity NUMBER;BEGIN SELECT ITEMRATE INTO identity FROM itemFile WHERE itemcode = value1; IF identity < 200 THEN value2:=100; END IF;END;,,DECLARE value1 VARCHAR2(5) := 'i202'; value2 NUMBER;BEGIN test (value1, value2); DBMS_OUTPUT.PUT_LINE('value2 的值为' || TO_CHAR(value2));END;/,过程 8-7,13,CREATE OR REPLACE PROCEDURE swap(p1 IN OUT NUMBER, p2 IN OUT NUMBER)IS v_temp NUMBER;BEGIN v_temp := p1; p1 := p2; p2 := v_temp;END;/,,SQL> SET SERVEROUT ONSQL> DECLARE num1 NUMBER := 100; num2 NUMBER := 200;BEGIN swap(num1, num2); DBMS_OUTPUT.PUT_LINE('num1 = ' || num1); DBMS_OUTPUT.PUT_LINE('num2 = ' || num2);END;/,,过程 8-8,将过程的执行权限授予其他用户:删除过程:,14,SQL> GRANT EXECUTE ON find_emp TO MARTIN;SQL> GRANT EXECUTE ON swap TO PUBLIC;,SQL> DROP PROCEDURE find_emp;,函数 4-1,函数是可以返回值的命名的 PL/SQL 子程序。 创建函数的语法: CREATE [OR REPLACE] FUNCTION [(param1,param2)]RETURN IS|AS [local declarations]BEGIN Executable Statements; RETURN result;EXCEPTION Exception handlers;END;,15,,,函数 4-2,16,定义函数的限制:函数只能接受 IN 参数,而不能接受 IN OUT 或 OUT 参数形参不能是 PL/SQL 类型函数的返回类型也必须是数据库类型访问函数的两种方式:使用 PL/SQL 块使用 SQL 语句,函数 4-3,17,创建函数:从 SQL 语句调用函数:,CREATE OR REPLACE FUNCTION fun_hello RETURN VARCHAR2ISBEGIN RETURN '朋友,您好';END;/,SQL> SELECT fun_hello FROM DUAL;,函数 4-4,18,CREATE OR REPLACE FUNCTION item_price_range (price NUMBER) RETURN VARCHAR2 AS min_price NUMBER; max_price NUMBER;BEGIN SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price FROM itemfile; IF price >= min_price AND price <= max_price THEN RETURN '输入的单价介于最低价与最高价之间'; ELSE RETURN '超出范围'; END IF;END;/,DECLARE P NUMBER := 300; MSG VARCHAR2(200);BEGIN MSG := item_price_range(300); DBMS_OUTPUT.PUT_LINE(MSG);END;/,,过程和函数的比较,19,自主事务处理 2-1,自主事务处理主事务处理启动独立事务处理然后主事务处理被暂停自主事务处理子程序内的 SQL 操作然后终止自主事务处理恢复主事务处理PRAGMA AUTONOMOUS_TRANSACTION 用于标记子程序为自主事务处理,20,自主事务处理 2-2,自主事务处理的特征:与主事务处理的状态无关提交或回滚操作不影响主事务处理自主事务处理的结果对其他事务是可见的能够启动其他自主事务处理,21,程序包,程序包是对相关过程、函数、变量、游标和异常等对象的封装程序包由规范和主体两部分组成,22,声明程序包中公共对象。包括类型、变量、常量、异常、游标规范和子程序规范等,声明程序包私有对象和实现在包规范中声明的子程序和游标,,程序包,,,规范,主体,,,创建程序包 2-1,程序包规范CREATE [OR REPLACE] PACKAGE package_name IS|AS[Public item declarations][Subprogram specification]END [package_name];,程序包主体CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS[Private item declarations][Subprogram bodies][BEGINInitialization]END [package_name];,23,创建程序包 2-2,24,CREATE OR REPLACE PACKAGE pack_meIS PROCEDURE order_proc (orno VARCHAR2); FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2;END pack_me;/,,,CREATE OR REPLACE PACKAGE BODY pack_me AS PROCEDURE order_proc (orno VARCHAR2) IS stat CHAR(1); BEGIN SELECT ostatus INTO stat FROM order_master WHERE orderno = orno; …… END order_proc; FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2 IS icode VARCHAR2(5); ocode VARCHAR2(5); BEGIN …… END order_fun;END pack_me;/,,,,程序包的优点,模块化更轻松的应用程序设计信息隐藏新增功能性能更佳,25,程序包中的游标 2-1,游标的定义分为游标规范和游标主体两部分在包规范中声明游标规范时必须使用 RETURN 子句指定游标的返回类型RETURN子句指定的数据类型可以是:用 %ROWTYPE 属性引用表定义的记录类型程序员定义的记录类型,26,程序包中的游标 2-2,27,SQL> CREATE OR REPLACE PACKAGE cur_pack IS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE; PROCEDURE ord_pro(vcode VARCHAR2);END cur_pack;/,,SQL> CREATE OR REPLACE PACKAGE BODY cur_pack AS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS SELECT * FROM order_master WHERE VENCODE=vcode; PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE; BEGIN OPEN ord_cur(vcode); LOOP FETCH ord_cur INTO or_rec; EXIT WHEN ord_cur%NOTFOUND; DBMS_OUTPUT.PUT_LIne(’返回的值为' || or_rec.orderno); END LOOP; END ord_pro;END cur_pack;/,,,有关子程序和程序包的信息,USER_OBJECTS 视图包含用户创建的子程序和程序包的信息USER_SOURCE 视图存储子程序和程序包的源代码,28,SELECT object_name, object_typeFROM USER_OBJECTSWHERE object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');,SELECT line, text FROM USER_SOURCEWHERE NAME='TEST';,总结,子程序是命名的 PL/SQL 块,可带参数并可在需要时随时调用有两种类型的PL/SQL子程序,即过程和函数过程用户执行特定的任务,函数用于执行任务并返回值程序包是对相关类型、变量、常量、游标、异常、过程和函数等对象的封装程序包由两部分组成,即包规范和包主体使用程序包的优点是:模块化、更轻松的程序设计、信息隐藏、新增功能以及性能更佳,29,
展开阅读全文
  麦档网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:oracle学习第七讲-子程序和程序包.pptx
链接地址:https://www.maidoc.com/p-1594.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

[email protected] 2018-2020 maidoc.com版权所有  文库上传用户QQ群:3303921 

麦档网为“文档C2C模式”,即用户上传的文档所得金币直接给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的金币归上传人(含作者)所有。
备案号:蜀ICP备17040478号-3  
川公网安备:51019002001290号 

本站提供办公文档学习资料考试资料文档下载


收起
展开