Oracle中的“批量收集”和“立即执行”

时间:2014-01-14 15:14:53

标签: oracle

是否可以在oracle中使用"bulk Collect into"命令执行"execute immediate"?所有这些都将成为返回管道表的函数的一部分。

2 个答案:

答案 0 :(得分:8)

是的,从技术上讲,你可以:

  1  SQL> declare
  2   type x is table of t.id%type index by pls_integer;
  3   xx x;
  4  begin
  5   execute immediate
  6   'select id from t' bulk collect into xx;
  7   dbms_output.put_line(xx.count);
  8  end;
  9  /
426 

Oracle在文档中明确指出了这一点:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm

但是,如果你真的需要执行动态SQL,那么你可以使用更有用的方法事件 - 弱ref游标。您可以访问LIMIT这样强大的选项,并且可以使用记录集合。

SQL> declare
  2   type x is table of t%rowtype index by pls_integer;
  3   xx x;
  4   c sys_refcursor;
  5  begin
  6    open c for 'select * from t';
  7    loop
  8      fetch c bulk collect into xx limit 100;
  9      dbms_output.put_line(xx.count);
 10      exit when c%notfound;
 11    end loop;
 12    close c;
 13  end;
 14  /
100                                                                             
100                                                                             
100                                                                             
100                                                                             
26   

答案 1 :(得分:1)

根据Dmitry Nikiforov提出的想法,我使用游标解决了问题,这是解决方案;)

FUNCTION myFunction (  parameter_p IN VARCHAR2) RETURN myTableType PIPELINED

IS
  c sys_refcursor;
  stmt varchar2(4000);  
  out_rec mYrowType;
  rec mYrowType;
BEGIN

    stmt:='Select * from ''' || parameter_p || '''';
    open c for stmt;

    LOOP
    fetch c into rec;
    EXIT WHEN c%NOTFOUND;

        out_rec.field1 := rec.field1;
        out_rec.field2 := rec.field2;
        out_rec.field3 := rec.field3;

        PIPE Row(out_rec);
    END LOOP;

  Close c;
  Return;

END myFunction;