具有可变列/表/条件的Oracle游标

时间:2014-04-14 04:52:26

标签: oracle cursor oracle11gr2

我需要打开游标,而表名,列和where子句是不同的。表名等将作为参数传递。例如

CURSOR batch_cur
IS
SELECT a.col_1, b.col_1
FROM table_1 a inner join table_2 b 
ON a.col_2 = b.col_2
WHERE a.col_3 = 123

此处,投影列,表名,连接条件和where子句将作为参数传递。打开后,我需要遍历并处理每个提取的记录。

2 个答案:

答案 0 :(得分:0)

您需要使用dynamic SQL这样的内容:

procedure dynamic_proc
    ( p_table_1 varchar2
    , p_table_2 varchar2
    , p_value   number  
    )
is    
    batch_cur sys_refcursor;
begin
    open batch_cur for 
        'select a.col_1, b.col_1
         from ' || p_table_1 || ' a inner join || ' p_table_2 || ' b 
         on a.col_2 = b.col_2
         where a.col_3 = :bind_value1';
      using p_value;
    -- Now fetch data from batch_cur...
end;

请注意,对数据值使用绑定变量 - 如果您使用不同的值重复使用多次,这一点非常重要。

答案 1 :(得分:0)

从你的问题我想你需要一个动态光标。 Oracle为动态sql语句提供了REFCURSOR。由于您的查询将动态构建,因此您需要使用refcursor来执行此操作。

 create procedure SP_REF_CHECK(v_col1 number,v_col2 date,v_tab1 number,v_var1 char,v_var2 varchar2)
      is
       Ref_cur is REF CURSOR;
       My_cur Ref_cur;
       My_type  Table_name%rowtype;
       stmt varchar2(500);

  begin
    stmt:='select :1,:2  from :3 where :4=:5';
    open My_cur for stmt   using v_col1,v_col2,v_tab1,v_var1,v_var2;
  loop
    fetch My_cur into My_type;
                //do some processing  //
    exit when My_cur%notfound;
  end loop;
 close My_cur;
end;

点击此链接可获取更多http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/11_dynam.htm