我遇到了sql查詢的麻煩。如果同一行不存在,我需要插入一行。這是我到目前爲止有:sql - 插入如果不存在
DECLARE
BEGIN
FOR FOLDER_ROW IN (SELECT FOLDERID, USERID FROM DATA1.FOLDERS)
LOOP
IF NOT EXISTS (SELECT * FROM DATA1.FOLDER_USER WHERE FOLDER_ID = FOLDER_ROW.FOLDERID AND USER_ID = FOLDER_ROW.USERID)
INSERT INTO DATA1.FOLDER_USER (FOLDER_ID, USER_ID) VALUES (FOLDER_ROW.FOLDERID, FOLDER_ROW.USERID);
END LOOP;
COMMIT;
END;
我不會很熟悉SQL尤其是不存在的語法,所以當我執行我得到以下錯誤:
ORA-06550: line 37, column 11: PLS-00103: Encountered the symbol "INSERT" when expecting one of the following:
then and or
符號「然後」被替換爲「INSERT」以繼續。
ORA-06550: line 38, column 10: PLS-00103: Encountered the symbol "LOOP" when expecting one of the following: if ORA-06550: line 40, column 5: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: end not pragma final instantiable order overriding static member constructor map
++ 1'IF EXISTS()... INSERT'通常不是原子的,這意味着可以在存在檢查和插入之間插入衝突記錄。 –
@M_M - Oracle中的SQL語句始終是原子的。如果沒有唯一索引,則可能最終導致衝突,因爲插入的另一個會話沒有看到該行,因爲第一個會話尚未提交。 –
我不能說Oracle在這裏的行爲,但會聽取你的意見。我知道一些DBMS將'IF EXISTS(...)THEN'和'INSERT INTO'視爲兩個語句,而不是一個,但它也取決於事務隔離級別等。 –