Ошибка Oracle PLS-00103. Как проверить существующую запись и выполнить обновление или вставку на основе этого условия?
Мне нужно проверить, существует ли запись в таблице или нет из инструкции SELECT. Если запись существует, выполните обновление, в противном случае создайте запись в таблице. Я пытаюсь, но я получаю PLS-00103
ошибка.
Это ошибки, которые я получаю, когда запускаю свой код в DBVisaulzier:
18:00:09 [DECLARE - 0 row(s), 0.000 secs] [Error Code: 6550, SQL State: 65000] ORA-06550: line 2, column 12:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
:= . ( @ % ; not null range default character
18:00:09 [BEGIN - 0 row(s), 0.000 secs] [Error Code: 6550, SQL State: 65000]
ORA-06550: line 2, column 97:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
;
18:00:09 [IF - 0 row(s), 0.000 secs] [Error Code: 900, SQL State: 42000] ORA-00900: invalid SQL statement
18:00:09 [ELSE - 0 row(s), 0.000 secs] [Error Code: 900, SQL State: 42000]
ORA-00900: invalid SQL statement
18:00:09 [END - 0 row(s), 0.000 secs] [Error Code: 900, SQL State: 42000] ORA-00900: invalid SQL statement
18:00:09 [END - 0 row(s), 0.000 secs] [Error Code: 900, SQL State: 42000] ORA-00900: invalid SQL statement
... 6 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 6 errors]
Вот мой код:
DECLARE a NUMBER;
BEGIN
SELECT 1
INTO a
FROM FREC_EMAIL t
WHERE t.FranchiseNo = '208254846'
AND t.ReportID = 1
AND t.id = 165;
IF a=1 THEN
UPDATE FREC_EMAIL
SET email = 'blah@foo.com'
WHERE FranchiseNo = '208254846'
AND ReportID = 1
AND ID = 165;
ELSE
INSERT INTO FREC_EMAIL
(FranchiseNo, Email, ReportID)
VALUES
('208254846', 'blah@foo.com', 1);
END IF;
END;
5 ответов
Мы всегда должны использовать SQL, когда это возможно, и избегать использования Pl / SQL, если это не является строго необходимым. Операторы SQL работают быстрее, они обычно требуют меньше ввода и их легче понять.
С тех пор как 9i Oracle предоставила MERGE, единственный оператор SQL, который выполняет оператор "upsert".
MERGE INTO frec_email t
USING (SELECT 'blah@foo.com' as email
, '208254846' as FranchiseNo
, 1 as ReportID
, 165 as ID
FROM dual ) s
ON (s.ID = t.ID)
WHEN MATCHED THEN
UPDATE SET t.email = s.email
WHEN NOT MATCHED THEN
INSERT (t.FranchiseNo, t.Email, t.ReportID)
VALUES (s.FranchiseNo, s.Email, s.ReportID)
/
В блоке pl/sql вы можете сделать это:
обновить столбец набора таблиц =.... где.....;
если SQL%ROWCOUNT = 0, ТО вставьте...... END IF;
К
Я обычно использую следующую концепцию, которая, на мой взгляд, более читаема, чем слияние:
BEGIN
UPDATE FREC_EMAIL
SET email = 'blah@foo.com'
WHERE FranchiseNo = '208254846'
AND ReportID = 1
AND ID = 165;
IF SQL%NOTFOUND THEN
INSERT INTO FREC_EMAIL
(FranchiseNo, Email, ReportID, ID)
VALUES
('208254846', 'blah@foo.com', 1, 165);
END IF;
END;
Кстати, если вы новичок в Oracle, стоит потратить время на ознакомление с официальной документацией. Хотя может показаться сложным, с чего начать, " Дорожная карта" Тома Кайта - хорошее место, чтобы получить список обязательных прочтений.
Удачи!
Используйте команду MERGE (также называемую upsert некоторыми). Ссылка на Oracle (с примером) здесь.