我可以使用变量名调用游标吗?

时间:2017-09-27 19:05:23

标签: oracle plsql

  

我想根据输入参数调用游标。 '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;

3 个答案:

答案 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;
/