2014-06-12 68 views
0

我正在嘗試編寫一個腳本,將兩個表(table2,table3)的內容合併爲一個常見的腳本(table1)。語法錯誤:期望name_wo_function_call

我在一個Oracle實例上。

這是我的代碼。

DECLARE 
region VARCHAR2 :='REG1'; -- just for testing 
BEGIN 
    CASE 
     WHEN region = 'REG1' THEN 
      BEGIN 
       MERGE INTO table1 USING (
        SELECT 
         field1 table2field1, 
         field2 table2field2 
        FROM table2 
      ) ON (
        field1 = table2field1 
      ) 
       WHEN MATCHED THEN 
        UPDATE SET 
         field2 = table2field2 
       WHEN NOT MATCHED THEN 
        INSERT (
         field1, 
         field2 
       ) VALUES (
         table2field1, 
         table2field2 
       ); 
       COMMIT; 
      END; 
     WHEN region = 'REG2' THEN 
      BEGIN 
       MERGE INTO table1 USING (
        SELECT 
         field1 table3field1, 
         field2 table3field2 
        FROM table3 
      ) ON (
        field1 = table3field1 
      ) 
       WHEN MATCHED THEN 
        UPDATE SET 
         field2 = table3field2 
       WHEN NOT MATCHED THEN 
        INSERT (
         field1, 
         field2 
       ) VALUES (
         table3field1, 
         table3field2 
       ); 
       COMMIT; 
      END; 
    END; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      NULL; 
     WHEN OTHERS THEN 
     RAISE; 
END; 

SQL開發人員說:

Syntax error. Expected: 
    name_wo_function_call 
    name 
    procedure_call 

現在,我很新的PLSQL,我敢肯定,一定有我丟失的東西。

我該如何解決這個錯誤?

+0

會幫助,如果你發佈你的實際代碼 – Sathya

+0

@Sathya這是我的實際代碼,我只是改變表/字段名稱 – BackSlash

回答

2

小的變化:

WHEN region ='REG2'部分

,您有:

SELECT field1 table3field1, 
      field2 table3field2, -- extra comma 
    FROM table3 

多餘的逗號之前from子句不正確。同樣與

WHEN NOT MATCHED THEN 
        INSERT (
         field1, 
         field2, -- extra comma 
       ) VALUES (
         table3field1, 
         table3field2, -- extra comma 
       ); 
       COMMIT; 

雖然我懷疑這更多的是一種複製粘貼+ +拙劣的匿名錯誤..

此外,CASE語句應該END CASE結束,所以應該像

DECLARE 
    region VARCHAR2 := 'REG1';                -- just for testing 
BEGIN 
    CASE 
    WHEN region = 'REG1' THEN 
     BEGIN 
     MERGE INTO table1 
      USING (SELECT field1 table2field1, field2 table2field2 FROM table2) 
       ON (field1 = table2field1) 
     WHEN MATCHED THEN 
      UPDATE SET field2 = table2field2 
     WHEN NOT MATCHED THEN 
      INSERT  (field1, field2) 
       VALUES (table2field1, table2field2); 

     COMMIT; 
     END; 
    WHEN region = 'REG2' THEN 
     BEGIN 
     MERGE INTO table1 
      USING (SELECT field1 table3field1, field2 table3field2 FROM table3) 
       ON (field1 = table3field1) 
     WHEN MATCHED THEN 
      UPDATE SET field2 = table3field2 
     WHEN NOT MATCHED THEN 
      INSERT  (field1, field2) 
       VALUES (table3field1, table3field2); 

     COMMIT; 
     END; 

     NULL; 
    END CASE; -- end case, not just end 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    NULL; 
    WHEN OTHERS THEN 
    RAISE; 
END; 
+0

這是錯別字,我重新只要我注意到他們,他們就會感動他們,他們不再是這個問題了。但關鍵是'結束案例'。添加它將刪除語法錯誤。謝謝! – BackSlash

+0

太棒了,歡呼! – Sathya

相關問題