讲子程序和程序包.ppt_第1页
讲子程序和程序包.ppt_第2页
讲子程序和程序包.ppt_第3页
讲子程序和程序包.ppt_第4页
讲子程序和程序包.ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章,子程序和程序包,2,回顾,游标用于处理查询结果集中的数据 游标类型有:隐式游标、显式游标和 REF 游标 隐式游标由 PL/SQL 自动定义、打开和关闭 显式游标用于处理返回多行的查询 显式游标可以删除和更新活动集中的行 要处理结果集中所有记录时,可使用循环游标 在声明 REF 游标时,不需要将 SELECT 语句与 其关联,3,目标,创建和使用子程序 (重点) - 创建和使用程序包(重点),4,专业英语,Package 包裹, 包 Body 身体,人,尸体,主要部分, 大量 Pragmatic 国事的, 团体事务的, 实际的 Autonomous 自治的 Transaction 处理, 会报, 交易, 事务, 处理事务,5,子程序 2-1,命名的 PL/SQL 块,编译并存储在数据库中。 子程序的各个部分: 声明部分 可执行部分 异常处理部分(可选) 子程序的分类: 过程 执行某些操作 函数 执行操作并返回值,6,子程序 2-2,子程序的优点: 模块化 将程序分解为逻辑模块 可重用性 可以被任意数目的程序调用 可维护性 简化维护操作 安全性 通过设置权限,使数据更安全,7,过程 8-1,过程是用于完成特定任务的子程序 例如:,前往售票厅,询问关于车票的信息,排队等候,在柜台购买车票,8,过程 8-2,创建过程的语法: CREATE OR REPLACE PROCEDURE () IS|AS BEGIN EXCEPTION END;,创建过程,可指定运行过程需传递的参数,处理异常,包括在过程中要执行的语句,9,过程 8-3,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; /,10,过程 8-4,过程参数的三种模式: IN 用于接受调用程序的值 默认的参数模式 OUT 用于向调用程序返回值 IN OUT 用于接受调用程序的值,并向调用程序返回更新的值,11,过程 8-5,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 ON SQL EXECUTE itemdesc(i201);,执行过程的语法: EXECUTE procedure_name(parameters_list);,12,过程 8-6,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; /,13,过程 8-7,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 ON SQL DECLARE num1 NUMBER := 100; num2 NUMBER := 200; BEGIN swap(num1, num2); DBMS_OUTPUT.PUT_LINE(num1 = | num1); DBMS_OUTPUT.PUT_LINE(num2 = | num2); END; /,14,过程 8-8,将过程的执行权限授予其他用户: 删除过程:,SQL GRANT EXECUTE ON find_emp TO MARTIN; SQL GRANT EXECUTE ON swap TO PUBLIC;,SQL DROP PROCEDURE find_emp;,15,函数 4-1,函数是可以返回值的命名的 PL/SQL 子程序。 创建函数的语法: CREATE OR REPLACE FUNCTION (param1,param2) RETURN IS|AS local declarations BEGIN Executable Statements; RETURN result; EXCEPTION Exception handlers; END;,16,函数 4-2,定义函数的限制: 函数只能接受 IN 参数,而不能接受 IN OUT 或 OUT 参数 形参不能是 PL/SQL 类型 函数的返回类型也必须是数据库类型 访问函数的两种方式: 使用 PL/SQL 块 使用 SQL 语句,17,函数 4-3,创建函数: 从 SQL 语句调用函数:,CREATE OR REPLACE FUNCTION fun_hello RETURN VARCHAR2 IS BEGIN RETURN 朋友,您好; END; /,SQL SELECT fun_hello FROM DUAL;,18,函数 4-4,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,过程和函数的比较,20,自主事务处理 2-1,自主事务处理 主事务处理启动独立事务处理 然后主事务处理被暂停 自主事务处理子程序内的 SQL 操作 然后终止自主事务处理 恢复主事务处理 PRAGMA AUTONOMOUS_TRANSACTION 用于标记子程序为自主事务处理,21,自主事务处理 2-2,自主事务处理的特征: 与主事务处理的状态无关 提交或回滚操作不影响主事务处理 自主事务处理的结果对其他事务是可见的 能够启动其他自主事务处理,22,程序包,程序包是对相关过程、函数、变量、游标和异常等对象的封装 程序包由规范和主体两部分组成,声明程序包中公共对象。包括类型、变量、常量、异常、游标规范和子程序规范等,声明程序包私有对象和实现在包规范中声明的子程序和游标,程序包,规范,主体,23,创建程序包 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 BEGIN Initialization END package_name;,24,创建程序包 2-2,CREATE OR REPLACE PACKAGE pack_me IS 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,程序包的优点,模块化 更轻松的应用程序设计 信息隐藏 新增功能 性能更佳,26,程序包中的游标 2-1,游标的定义分为游标规范和游标主体两部分 在包规范中声明游标规范时必须使用 RETURN 子句指定游标的返回类型 RETURN子句指定的数据类型可以是: 用 %ROWTYPE 属性引用表定义的记录类型 程序员定义的记录类型,27,程序包中的游标 2-2,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; /,28,有关子程序和程序包的信息,USER_OBJECTS 视图包含用户创建的子程序和程序包的信息 USER_SOURCE 视图存储子程序和程序包的源代码,SELECT object_name, object_type FROM USER_OBJECTS WHERE object_type IN (PROCEDURE, FUNCTION, PAC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论