zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    leetcode Remove Linked List Elements
    leetcode Word Pattern
    leetcode Isomorphic Strings
    leetcode Valid Parentheses
    leetcode Remove Nth Node From End of List
    leetcode Contains Duplicate II
    leetcode Rectangle Area
    leetcode Length of Last Word
    leetcode Valid Sudoku
    leetcode Reverse Bits
  • 原文地址:https://www.cnblogs.com/kingsleylam/p/3284018.html
Copyright © 2011-2022 走看看