带有可变列/表/条件的Oracle游标
当表名、列和where子句发生变化时,我需要打开一个游标。表名etc将作为参数传递。比如说带有可变列/表/条件的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
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;
查看此链接了解更多信息