我需要打开游标,而表名,列和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子句将作为参数传递。打开后,我需要遍历并处理每个提取的记录。
答案 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