簡體   English   中英

在IF子句中執行select / insert語句Oracle

[英]Execute select/insert statement within an IF clause Oracle

僅在存在表的情況下,才需要在IF子句中執行一些語句。 但是我面臨的問題是,即使條件為假,語句也會被執行。

DECLARE
  count_matching_row NUMBER := 0;
  count_matching_tbl NUMBER := 0;
BEGIN
  SELECT COUNT(*)
  INTO count_matching_tbl
  FROM user_tables 
  WHERE LOWER(table_name) = 'tab1';
  IF(count_matching_tbl = 1)
    THEN

      SELECT COUNT (*)
      INTO   count_matching_row
      FROM   test1
      WHERE  ID IN (SELECT ID FROM tab1);

      IF(count_matching_row = 0)
        THEN

          INSERT INTO review_case
            SELECT 
              DISTINCT ID, d,e
            FROM tab1
            WHERE ID IS NOT NULL;

          INSERT INTO review_case_payer
            SELECT 
              a,b,c
            FROM tab1
            WHERE a IS NOT NULL;
         COMMIT;
      END IF;
  END IF;
END;
/

每當我執行這些語句時,如果表'tab1'存在,它就可以正常工作。 如果表tab1不存在,則會出現錯誤

“ ORA-06550:第13行,第14列:PL / SQL:ORA-00942:表或視圖不存在”對於嘗試訪問表“ tab1”的每一行,我都會收到類似的錯誤

我嘗試使用ref游標,但仍然相同,無法將其用於insert語句。

您的錯誤是由於您使用的表可能不存在; 拋出此錯誤是因為腳本存在編譯問題,而不是數據問題,因此嘗試使用IF方式不足以解決您的情況。

您需要使用一些動態SQL來處理不存在的對象。 例如,請參閱以下內容。

如果該表不存在,則不會執行任何操作:

SQL> select * from tab1;
select * from tab1
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> declare
  2      vCountTab number;
  3  begin
  4      select count(1)
  5      into vCountTab
  6      from user_tables
  7      where table_name = 'TAB1';
  8
  9      if vCountTab = 1 then
 10          execute immediate 'insert into TAB1 values (1, 2)';
 11      end if;
 12  end;
 13  /

PL/SQL procedure successfully completed.

如果該表存在,則將完成插入:

SQL> create table tab1(a number, b number);

Table created.

SQL> declare
  2      vCountTab number;
  3  begin
  4      select count(1)
  5      into vCountTab
  6      from user_tables
  7      where table_name = 'TAB1';
  8
  9      if vCountTab = 1 then
 10          execute immediate 'insert into TAB1 values (1, 2)';
 11      end if;
 12  end;
 13  /

PL/SQL procedure successfully completed.

SQL> select * from tab1;

         A          B
---------- ----------
         1          2

SQL>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM