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

带有可变列/表/条件的Oracle游标,oracle,cursor,oracle11gr2,Oracle,Cursor,Oracle11gr2,当表名、列和where子句发生变化时,我需要打开一个游标。表名etc将作为参数传递。比如说 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子句将作为参数传递。打开后,我需要循环并处理每个获取的记录。您需要使用以下内容: procedure dynamic_pr

当表名、列和where子句发生变化时,我需要打开一个游标。表名etc将作为参数传递。比如说

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子句将作为参数传递。打开后,我需要循环并处理每个获取的记录。

您需要使用以下内容:

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;

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

根据您的问题,我想您需要一个动态光标。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;
查看此链接了解更多信息