【问题标题】:plsql- Oracle collectionsplsql-Oracle 集合
【发布时间】:2018-01-28 06:12:34
【问题描述】:

如何从表中获取所有列并存储到集合变量中。(作为单个变量)

大家好, 请帮我在oracle plsql中的这些问题中编写代码

【问题讨论】:

    标签: plsql plsqldeveloper user-defined-types


    【解决方案1】:

    “如何从表中获取所有列并存储到集合变量中。(作为单个变量” - 如果您的表有数百万/数十亿行怎么办?您想淹没您的 PGA 内存! 您可以使用带限制的批量收集来获取有限数量的行并对其进行处理,当处理完成后,您可以将它们存储在某处并获取下一组行。

    默认情况下,优化器将 Limit 100 放在 BULK COLLECT 子句之后。 PLSQL_OPTIMIZE_LEVEL 需要设置在 2 级或更高级别。 这是一个例子

    DECLARE 
    
    TYPE yourtable_nt IS TABLE OF yourtable%rowtype;
    tab yourtable_nt;
    CURSOR cur IS SELECT * FROM yourtable;
    
    BEGIN
     
    OPEN cur;
    
    LOOP 
    FETCH cur BULK COLLECT INTO tab LIMIT 100;  -- FOR EVERY FETCH DATA IS STORED IN tab FROM INDEX 1
         
          FOR i in 1..tab.COUNT LOOP 
          Null;
           -- PROCESS YOUR COLLECTION DATA
          END LOOP;
    
    EXIT WHEN cur%NOTFOUND;
    END LOOP;
    
    CLOSE cur;
    
    EXCEPTION 
        WHEN OTHERS THEN
        IF cur%ISOPEN THEN 
        CLOSE cur;
        END IF;
    END;
    /
    

    您可能需要为您的餐桌找到一个适合BULK COLLECT LIMIT 的号码。 如果您的表有很多行,请为 LIMIT 尝试不同的数字,否则执行时间的差异是微不足道的。

    【讨论】:

      【解决方案2】:

      这个问题太模糊了,无法提供一个确定的答案,但这段代码是对它的一种解释的解决方案:“如何填充与表的投影匹配的 PL/SQL 集合?” p>

      declare
          --
          -- collection of records which match EMP table
          type emp_nt is table of emp%rowtype;
          --
          -- variable instance of that type
          emp_recs emp_nt;
      begin
          -- use BULK COLLECT clause to populate the collection with records 
          select e.*
          bulk collect into emp_recs
          from emp e
          where e.deptno = 20;
      end;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-02
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多