如果选择语句中使用的表有时不存在,如何声明游标?

问题描述 投票:0回答:2

我需要在不同的环境下运行以下代码,并且当table1存在时工作正常,但是当table1不存在时,它将在游标声明“表或视图不存在”中引发错误。我在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;
/
sql database oracle plsql
2个回答
0
投票

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

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

要解决此问题,请使用SYS_REFCURSOR和动态sql查询,如上面Tejash所述。这使您可以在设置游标之前检查表是否存在。如果该表存在,则将光标设置为从指定表中选择。如果不存在,则输出一条消息,指出它不存在。

请注意,您也可以使用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


0
投票

您可以如下使用光标的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;
/
© www.soinside.com 2019 - 2024. All rights reserved.