繁体   English   中英

如果 select 语句中使用的表有时可能不存在,如何声明 cursor?

[英]How to declare a cursor if table used in select statement may not exist sometimes?

我需要在不同的环境中运行下面的代码,当 table1 存在时它工作正常,但当它不存在时,它会在 cursor 声明中抛出“表或视图不存在”的错误。 我在 Oracle 上运行它。 你能帮我纠正这个吗? 提前致谢。

DECLARE
CURSOR my_cursor IS (select "col1" from "table1");
name1 VARCHAR2(256);
tableCount NUMBER;
BEGIN
Select count(*) into tableCount from user_tab_cols where table_name = 'table1' and column_name = 'col2';
IF tableCount > 0 THEN
OPEN my_cursor;
LOOP
FETCH my_cursor into name1;
EXIT WHEN my_cursor%notfound;
-- Update or delete statement here
DBMS_OUTPUT.PUT_LINE('value is ' || name1);
END LOOP;
CLOSE my_cursor;
END IF;
END;
/

您可以使用 cursor 的exceptionsdynamic string ,如下所示:

DECLARE
    MY_CURSOR    SYS_REFCURSOR;
    NAME1        VARCHAR2(256);
    TABLECOUNT   NUMBER;
BEGIN
    OPEN MY_CURSOR FOR 'SELECT ACC_NR FROM ACCOUNT'; -- dynamic string for cursor

    LOOP
        FETCH MY_CURSOR INTO NAME1;
        EXIT WHEN MY_CURSOR%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('value is ' || NAME1);
    END LOOP;

    CLOSE MY_CURSOR;
EXCEPTION -- exception handling using SQLCODE
    WHEN OTHERS THEN
        IF SQLCODE = -942 THEN
            DBMS_OUTPUT.PUT_LINE('Table does not exists');
        ELSIF SQLCODE = -904 THEN
            DBMS_OUTPUT.PUT_LINE('Invalid column name');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Other error');
        END IF;
END;
/

具有已定义返回类型的 CURSOR 是强类型的。 Sys_refcursors 是弱类型的。 这意味着 CURSOR 中的任何返回类型都必须有效。 SYS_REFCURSOR 更灵活,可以在以后定义。

在声明部分设置 CURSOR 时,您必须使用将正确执行的 SQL 语句。 在这种情况下,您将 CURSOR 设置为 select 一个不存在的表中的列。 数据库执行不会到达代码主体,因为它在退出声明块之前出错。

要解决此问题,请使用带有动态 sql 查询的 SYS_REFCURSOR,如上面 Tejash 所述。 这允许您在设置 cursor 之前检查表是否存在。 如果该表存在,则从指定的表中将 cursor 设置为 select。 如果不存在,output 一条消息说它不存在。

请注意,您还可以使用 SQL 错误代码,如其他答案所示。 我个人更喜欢在错误发生之前处理逻辑中的业务规则。

DECLARE
 my_cursor sys_refcursor;
name1 VARCHAR2(256);
tableCount NUMBER;
BEGIN
Select count(*) into tableCount from user_tab_cols where table_name = 'table1' and column_name = 'col2';
IF tableCount > 0 THEN
OPEN my_cursor for 'select order_id from table1';
LOOP
FETCH my_cursor into name1;
EXIT WHEN my_cursor%notfound;
-- Update or delete statement here
DBMS_OUTPUT.PUT_LINE('value is ' || name1);
END LOOP;
CLOSE my_cursor;
else
dbms_output.put_line('Table does not exist');
END IF;
END;

http://docs.oracle.com/database/122/LNPLS/static-sql.htm#LNPLS568

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM