2012-09-03 349 views
1

爲什麼我會收到此錯誤,以及解析的語句是什麼意思。爲什麼我得到ORA-01003:沒有語句解析錯誤?

ORA-01003: no statement parsed 

下面是代碼:

PROCEDURE ORIGINAL_TABLE.UPDATE_GROUPS IS 
-- cursor loaded with the swam groups 
CURSOR cursor1 IS 
    SELECT ID, NEW_DESCRIPTION 
    FROM [email protected]_LINK.X; 

BEGIN 
    FOR C1_REC IN cursor1 LOOP 
     UPDATE 
      ORIGINAL_TABLE."GROUPS" 
     SET 
      GROUP_ID = C1_REC.ID 
     WHERE 
      ORIGINAL_TABLE."GROUPS".DESCRIPTION = C1_REC.NEW_DESCRIPTION; 

     IF (SQL%ROWCOUNT = 0) THEN 
      INSERT INTO 
        ORIGINAL_TABLE.GROUPS("GROUP_ID", "DESCRIPTION") 
      VALUES (C1_REC.ID, C1_REC.NEW_DESCRIPTION); 
     END IF; 

    END LOOP; 

    EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line(SQLERRM); 
END; 

我試着用上面的代碼做的是更新和舊錶中的值的新表,並在情況下,新的組沒有按」存在插入它。

更新:更改了%ROWCOUNT> 0%ROWCOUNT = 0

+1

您是否在另一窗口中測試了光標查詢?我認爲這是因爲查詢 – HRgiger

+0

這是當你編譯過程或當你執行它?你有線嗎?也許你需要刪除測試的異常。還有什麼讓我困惑的是,爲什麼當SQL%ROWCOUNT'is> 0應該不是= 0時插入呢?但那不是你的問題。是的,選擇是否作爲一個單一的聲明? – hol

+0

是的選擇作爲一個單一的聲明,它發生在我執行程序時。它編譯沒有錯誤。 –

回答

5

用MERGE語句,它更有效地做更新/插入的東西,要注意你的PLSQL沒有提供它專供。它試圖做一個更新聲明,如果一條記錄發現它插入另一條記錄。爲了解決它使用 IF(SQL%ROWCOUNT = 0) 我認爲這個問題的原因是。以DBLINK名義。

此外,我建議擺脫引用的表/字段以防萬一以及模式名稱。

換句話說刪除全部ORIGINAL_TABLE。

merge into groups g 
using (
SELECT ID, NEW_DESCRIPTION 
FROM [email protected]_LINK.X 
) nt 
on (nt.NEW_DESCRIPTION = g.description ) 
when matched then update set g.group_id = nt.id 
when non matched then insert(GROUP_ID, DESCRIPTION) 
         values(nt.id, nt.NEW_DESCRIPTION) 
+0

是的,關於ORIGINAL_TABLE我將原來的表格名稱更改爲在此處發佈。 –

+0

塊何時失敗?在更新或插入語句?註釋他們兩個替換爲NULL;如果它沒有幫助讓我們繼續 –

+0

它執行失敗,它不會更新或插入。 –

相關問題