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

  • 相关阅读:
    MSP430F149学习之路——蓝牙模块
    MSP430F149学习之路——SPI
    MSP430推荐网站
    MSP430F149学习之路——UART
    MSP430F149学习之路——比较器Comparaor_A
    MSP430F149学习之路——PWM信号
    MSP430F149学习之路——捕获/比较模式
    MSP430F149学习之路——时钟1
    CUDA学习笔记(三)——CUDA内存
    CUDA学习笔记(一)——CUDA编程模型
  • 原文地址:https://www.cnblogs.com/kingsleylam/p/3284018.html
Copyright © 2011-2022 走看看