热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PL/SQL高级应用(游标、存储过程、函数、程序包)

Oracle笔记(八)、PLSQL高级应用(游标、存储过程、函数、程序包)一、游标二、存储过程三、函数过程与函数的异同四、程序包一、游标游标是一种PLSQL控制结构,可以
Oracle 笔记(八)、PL/SQL 高级应用(游标、存储过程、函数、程序包)



一、游标
二、存储过程
三、函数
    过程与函数的异同
四、程序包



一、游标
    游标是一种 PL/SQL 控制结构,可以对SQL语句的处理进行显式控制,便于对表的数据逐条进行处理。
ps.当表中数据量大的时候,不建议使用游标(效率不高,耗费资源),但是它能逐条取数据方法灵活。
    游标是记录的指针,利用游标对活动集的更新或删除会反馈到表的记录上。

游标属性:%FOUND、%NOTFOUND、%ROWCOUNT、%ISOPEN


1、显式游标
    显式游标是由用户显式声明的游标。根据在游标中定义的查询,查询返回的行集可以包含零或多行,这些行称为活动集。游标将指向活动集中的当前行。

显式游标操纵过程:声明、打开、从游标中获取记录、关闭。

SET SERVEROUTPUT ON;
DECLARE
  CURSOR cur IS
    SELECT * FROM books;
  myrecord books%ROWTYPE;
BEGIN
  OPEN cur;
  LOOP
    FETCH cur INTO books;
    EXIT WHEN cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(books.id || ' ' || books.name);
  END LOOP;
  CLOSE cur;
END;


1.1、带参数的显式游标:参数不需指定长度或者精度。
1.2、FOR 循环游标:采用遍历方式,自动打开、提取和关闭游标。(能否利用 %ROWCOUNT 获得游标提取的行数?)

DECLARE
  /* 定义带参数游标 */
  CURSOR cur_para(id varchar2) IS
  SELECT books_name FROM books WHERE books_id = id;
BGEIN
  /* 调用带参数游标,并以 FOR 循环方式处理 */
  FOR cur IN cur_para('0001') LOOP
    DBMS_OUTPUT.PUT_LINE(cur.books_id || ' ' || cur.books_id);
  END LOOP;
END;

1.3、使用显示游标删除或更新记录
定义时:需使用 SELECT ... FOR UPDATE 语句表示事物的锁定;
执行时:需使用 WHERE CURRENT OF curXXX 子句指定游标的当前行。

  /* 定义部分 */
  CURSOR cur IS
  SELECT name FROM deptment FOR UPDATE;
....
  /* 执行部分 */
  UPDATE deptment SET name=name || '_tt' WHERE CURRENT OF cur;


2、隐式游标
不需声明,打开和关闭的游标。PL/SQL 为所有的 SQL 数据操纵语句隐式声明游标,它是不能直接命名和控制。

BEGIN
  FROM cur IN (SELECT name FROM deptment) LOOP
    DBMS_OUTPUT.PUT_LINE(cur.books_id || ' ' || cur.books_id);
  END LOOP;
END;


ps.
匿名块:每次执行时都需要被编译,并且无法存储到数据库中,别的 PL/SQL 块也无法调用它。
命名块:存储在数据库中,属于数据库对象。

排错:SHOW ERRORS PROCEDURE/FUNCTION/PACKAGE obj_name;



二、存储过程

CREATE OR REPLACE PROCEDURE test (value IN varchar2, value2 OUT NUMBER)
  /* 参数,不需指定长度或精度 */
IS
  /* 局部变量,省略 DECLARE 关键字,需有长度 */
  identity NUMBER;
BEGIN
  SELECT ITEMRATE INTO identity
    FROM itemFile
    WHERE itemcode = value;
  IF identity <200 THEN
    value2 := 200;
  ELSE
    value2 :=50;
  END IF;
END;


● 匿名块执行过程

DECLARE
  tvalue2 NUMBER;
BEGIN
  test('i202', tvalue2);
  DBMS_OUTPUT.PUT_LINE('value2的值为:' || TO_CHAR(value2));
END;

● 单独执行
    EXECUTE myproc('0001');



三、函数
    函数的主要特性是它必须返回一个值。创建函数时通过 RETURN 子句指定函数返回值的数据类型。
函数的一些限制:
  ● 函数只能带有 IN 参数,不能带有 IN OUT 或 OUT 参数。
  ● 形式参数必须只使用数据库类型,不能使用 PL/SQL 类型。
  ● 函数的返回类型必须是数据库类型。

CREATE OR REPLACE FUNCTION item_price_rage (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(p);
  DBMS_OUTPUT.PUT_LINE(MSG);
END;

● SELECT查询调用(因为函数必须有返回值)
    SELECT myfunction FROM dual;



    过程与函数的异同
过程:
    作为 PL/SQL 语句执行;
    在规范中不包含 RETURN 子句;
    不返回任何值(只有输入/输出参数,结果集);
    可以包含 RETURN 语句,但是与函数不同,它不能用于返回值。
函数:
    作为表达式的一部分调用;
    必须在规范中包含 RETURN 子句;
    必须返回单个值;
    必须包含至少一条 RETURN 语句。



四、程序包
    程序包是一种数据库对象,它是对相关 PL/SQL 类型、子程序、游标、异常、变量和常量的封装。
程序包规范:声明类型、变量、常量、异常、游标和子程序。
程序包主体:用于实现在程序包规范中定义的游标、子程序。


4.1、程序包规范
包含应用程序所需的程序包资源,是与应用程序的接口。

CREATE OR REPLACE PACKAGE pack_me
IS
  PROCEDURE order_proc (orno varchar2);
  FUNCTION order_fun (ornos varchar2) RETURN varchar2;
END pack_me;

*创建 pack_me 包,并声明了子程序 order_proc 和 order_fun,并交由程序包主体实现。


4.2、程序包主体
当程序包规范中指定了子程序和游标时,必须有程序包主体。

CREATE OR REPLACE PACKAGE BODY pack_me
AS
  /* 实现定义的存储过程 */
  PROCEDURE order_proc (orno varchar2)
  IS
    stst CHAR(1);
  BEGIN
    SELECT ostatus INTO stat FROM order_master
      WHERE orderno = orno;
    IF stat = 'p' THEN
      DBMS_OUTPUT.PUT_LINE('暂挂的订单');
    ELSE
      DBMS_OUTPUT.PUT_LINE('已完成的订单');
    END IF;
  END order_proc;
  /* 实现定义的函数 */
  FUNCTION order_fun(ornos varchar2) RETURN varchar2
  IS
    icode varchar2(5);
    ocode varchar2(5);
    qtyord NUMBER;
    qtydeld NUMBER;
  BEGIN
    SELECT qty_ord, qty_deld, itemcode, ordernc INTO qtyord, qtydeld, icode, ocode
      FROM order_detail
      WHERE orderno = ornos;
    IF qtyord       RETURN ocode;
    ELSE
      RETURN icode;
    END IF;
  END order_fun;
END pack_me;


● 要执行 pack_me包中的 order_proc过程,输入
    EXECUTE pack_me.order_proc('o002');

● 要执行包中预定义的函数

DECLARE
  msg varchar2(10);
BEGIN
  msg := pack_me.order_fun('o002');
  DBMS_OUTPUT.PUT_LINE('值是 ' || msg);
END;

 
4.3、程序包的优点
    程序包将相关的功能在逻辑上组织在一起,模块化,信息隐藏和更好的性能。
ps.数据字典视图 USER_SOURCE 包含存储过程的代码文本。


4.4、内置程序包
STANDARD 和 DBMS_STANDARD:定义和扩展 PL/SQL 语言环境
DBMS_LOB:提供对 Oracle LOB 数据类型进行操作的功能
DBMS_LOCK:用户定义的锁
DBMS_OUTPUT:处理 PL/SQL 块和子程序输出调试信息
DBMS_SESSION:提供 ALTER SESSION 命令的 PL/SQL 等效功能
DBMS_ROWID:获得 ROWID 的详细信息
DBMS_RANDOM:提供随机数生成器
DBMS_SQL:允许用户使用动态 SQL,构造和执行任意 DML 或 DDL 语句
DBMS_JOB:提交和管理在数据库中执行的定时任务
DBMS_XMLDOM:用 DOM 模型读写 XML 类型的数据
DBMS_XMLPARSER:XML 解析,处理 XML 文档内容和结构
DBMS_XMLGEN:将 SQL 查询结果转换为规范的 XML 格式
DBMS_XMLQUERY:提供将数据转换为 XML 类型的功能
DBMS_XSLPROCESSOR:提供 XSLT 功能,转换 XML 文档
UTL_FILE:用 PL/SQL 程序来读写操作系统文本文件


推荐阅读
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
author-avatar
秦schueler
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有