Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 我可以使用变量名调用游标吗?_Oracle_Plsql - Fatal编程技术网

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

Oracle 我可以使用变量名调用游标吗?,oracle,plsql,Oracle,Plsql,我想根据输入参数调用游标。”dept'是来自命令行的输入。我得到PLS-00456:不是光标错误。有没有一种方法可以使用cursor\u name作为变量调用driving\u query\u int cursor 声明 部门varchar(8):=“int”; 游标_namevarchar(20):='driving_query | | | dept; 游标驱动\u查询\u int为 从中选择*; 开始 打开游标名称; 结束; 不需要使用动态光标名称,请改用此名称: declare d

我想根据输入参数调用游标。”dept'是来自命令行的输入。我得到PLS-00456:不是光标错误。有没有一种方法可以使用cursor\u name作为变量调用driving\u query\u int cursor

声明
部门varchar(8):=“int”;
游标_namevarchar(20):='driving_query | | | dept;
游标驱动\u查询\u int为
从中选择*;
开始
打开游标名称;
结束;

不需要使用动态光标名称,请改用此名称:

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等于“int”,则显示1,否则显示2。
理解逻辑后,只需将语句替换为所需的语句,并在循环中对逻辑进行编码。

不要使用此架构。这里不需要动态sql。因为您已经按照名称定义了所有游标。尝试使用IF-ELSE构造打开游标。如果光标背后的唯一动机是显示数据,那么我建议使用ref光标。希望下面的代码片段能有所帮助

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;
var lv\u cur refcursor;
声明
部门VARCHAR(8):=“int”;
游标_namevarchar(20):='driving_query | | | DEPT;
开始
如果游标名称='driving\u query\u int',则
打开:LV_CUR用于选择*FROM;
ELSIF CURSOR_NAME='something'然后
打开:LV_CUR用于选择*FROM;
--加上if条件
如果结束;
结束;
/
打印lv_cur;

您可以扩展您的场景吗?这个问题解决了吗

试试这个:

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

您的游标名称是driving\u query\u int而不是cursor\u name,因此它应该是:open driving\u query\u intYes,但我将再创建一个游标,并希望根据dept的值从两个游标中进行选择。例如,如果dept是共享的,然后游标名将被驱动查询共享,如果我对这两个游标使用相同的变量游标名-驱动查询名和驱动查询名共享,我将能够用一个变量名调用多个游标,如果有意义,请使用if:if条件共享,然后打开游标名共享;否则打开游标名称;如果结束;我不知道为什么要给游标起一个动态名称。我试过这样做,但下一个问题是,当使用fetch语句时,如果dept='int'fetch驱动\u query\u int进入某个对象,则无法写入;否则,获取共享的驱动程序\u查询\u。然后我必须编写相同的if-else逻辑来关闭光标。我通过创建变量名来避免这种情况。可能吗?
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;
/