Tôi đang gặp sự cố với truy vấn sql. Tôi cần chèn một hàng nếu cùng một hàng không tồn tại. Đây là những gì tôi có cho đến nay:sql - chèn nếu không tồn tại
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;
tôi sẽ không rất quen thuộc với sql đặc biệt là không tồn tại cú pháp như vậy khi tôi thực hiện tôi nhận được lỗi sau:
ORA-06550: line 37, column 11: PLS-00103: Encountered the symbol "INSERT" when expecting one of the following:
then and or
Biểu tượng "sau đó" đã được thay thế cho "INSERT" để tiếp tục.
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' thường không phải là nguyên tử, có nghĩa là một bản ghi xung đột có thể được chèn vào giữa kiểm tra sự tồn tại và chèn. –
@M_M - Một câu lệnh SQL trong Oracle luôn luôn là nguyên tử. Nếu không có chỉ mục duy nhất, bạn có thể kết thúc với các xung đột vì một phiên khác được chèn không thấy hàng bởi vì phiên đầu tiên chưa cam kết. –
Tôi không thể nói chuyện với hành vi của Oracle ở đây, nhưng sẽ nhận lời của bạn cho nó. Tôi biết một số DBMS xử lý 'NẾU EXISTS (...) THEN' và' INSERT INTO' là hai câu lệnh, không phải là một, nhưng nó phụ thuộc vào mức cô lập giao dịch và tương tự. –