我想根据输入参数调用游标。 'dept'是命令行的输入。我收到PLS-00456:没有游标错误。有没有办法使用cursor_name作为变量调用driving_query_int游标?
declare
dept varchar(8):= 'int';
cursor_name varchar(20):= 'driving_query_'||dept;
cursor driving_query_int is
select * from <table>;
begin
open cursor_name;
end;
答案 0 :(得分:1)
不需要使用动态游标名称,请改用:
declare
dept varchar(8):= 'int';
cursor_name SYS_REFCURSOR;
v_number number;
begin
if dept='int' then
open cursor_name for 'select 1 from dual';
else
open cursor_name for 'select 2 from dual';
end if;
loop
fetch cursor_name into v_number;
exit when cursor_name%NOTFOUND;
dbms_output.put_line(v_number);
end loop;
end;
/
如果dept等于&#34; int&#34;然后将显示1,否则将显示2。 你了解逻辑,juste用你需要的语句替换语句,并在循环中编写逻辑。
答案 1 :(得分:0)
不要使用这个建筑。在这里你不需要动态的SQL。因为您已根据名称定义了所有游标。尝试使用IF-ELSE构造来打开游标。如果此光标背后的唯一动机是显示数据,那么我将使用引用光标。希望在片段下方有所帮助。
var lv_cur refcursor;
DECLARE
dept VARCHAR(8) := 'int';
CURSOR_NAME VARCHAR(20):= 'driving_query_'||DEPT;
BEGIN
IF CURSOR_NAME = 'driving_query_int' THEN
OPEN :LV_CUR FOR SELECT * FROM <TABLE1>;
ELSIF CURSOR_NAME = 'something' THEN
OPEN :LV_CUR FOR SELECT * FROM <TABLE2>;
--Add on the if conditons
END IF;
END;
/
print lv_cur;
答案 2 :(得分:0)
你能扩展你的情景吗?这解决了吗?
试试这个:
var cur_nm refcursor;
c1 cur_nm;
DECLARE
dept VARCHAR(8) := 'int';
CURSOR_NAME VARCHAR(20):= 'driving_query_'||DEPT;
BEGIN
IF CUR_NAME = 'ur condition' THEN
OPEN c1 FOR SELECT * FROM tbl;
ELSIF CUR_NAME = 'ur condition' THEN
OPEN c1 FOR SELECT * FROM tbl;
--Add on the if conditons
END IF;
fetch blablabla into ur var;
END;
/