• PL/SQL 记录集合IS TABLE OF的使用


    在PL/SQL代码块中使用select into 赋值的话,有可能返回的是一个结果集。此时,如果使用基本类型或自定义的记录类型,将会报错。

    因此,需要定义一个变量,是某种类型的集合。下面以一个基于表的行类型的集合为例简单介绍一下(相信基本类型同理吧)。

     1 DECLARE
     2    CURSOR cur_tx IS  SELECT GKEY from t ;
     3     SUBTYPE  TX_TYPE IS t%ROWTYPE ; -- 定义类型
     4     TYPE TX_TAB IS TABLE OF TX_TYPE;--定义新类型,是某个类型的集合
     5     K t.GKEY%TYPE;
     6     V_Tx TX_TAB:=TX_TAB();--使用时应实例化,否则报错
     7 BEGIN
     8    OPEN CUR_TX;
     9    FETCH CUR_TX INTO K;
    10     SELECT * BULK COLLECT INTO V_Tx FROM t WHERE gkey=K; --返回结果集
    11    FORALL x in V_Tx.first .. V_Tx.last--遍历操作
    12           -- statement;      
    13    CLOSE CUR_TX;
    14 END;  

    集合类型要用IS TABLE OF来定义,表示是一个集合。

    /*在使用时,一定要实例化,否则报错:local collection types not allowed in SQL statements. 还表示collection type应该是schema级的才能使用。*/

    (注:经检查,与实例化无关,与select into时要使用bulk collect 有关)

    当然也可以使用游标,将结果集放在游标中。这里只是提供另一种思路。

    这里提到了BULK COLLECT和FORALL 批量绑定检索。

    FORALL与BULK COLLECT的使用方法: 
    1.使用FORALL比FOR效率高,因为前者只切换一次上下文,而后者将是在循环次数一样多个上下文间切换。 

    2.使用BLUK COLLECT一次取出一个数据集合,比用游标条取数据效率高,尤其是在网络不大好的情况下。但BLUK COLLECT需要大量内存,因此最好确保每次取出的记录不会很多。 

    参考:http://log-cd.iteye.com/blog/411122

  • 相关阅读:
    HTML5课程
    css3兼容代码
    动画
    css3学习笔记(一)
    3d旋转
    Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……
    AngularJs1.X学习--路由
    Angular学习笔记 ——input 标签上的【name属性】和【ngModelOptions属性】
    Angular学习笔记【ngx-bootstrap】中的 tabset
    TFS 签入时,提示“变更集注释策略 中的内部错误……”
  • 原文地址:https://www.cnblogs.com/kingsleylam/p/3284018.html
Copyright © 2020-2023  润新知