簡體   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