Тестирование на наличие первичного ключа в Oracle SQL Trigger - PullRequest
1 голос
/ 03 июня 2011

Я пытаюсь написать триггер в SQL, и код внутри должен определить, существует ли запись в таблице, прежде чем пытаться обновить или вставить.

Я пытался использовать оба

IF EXISTS
UPDATE
ELSE
INSERT

И

UPDATE
IF @@ROWCOUNT = 0
INSERT

Но ни один из них не работает.Я неравнодушен к последним, потому что мой работодатель сходит с ума по эффективности (ну ... да ...) По этой причине я также неохотно использую

IF SELECT COUNT(*) = 0
UPDATE
ELSE
INSERT

Кто-нибудь знает какие-либо способыобойти это?

-

ОБНОВЛЕНИЕ: я пытаюсь использовать MERGE, но я получаю несколько ошибок ...

MERGE INTO [tableName] AS Target
USING (SELECT :NEW.PIDM) AS Source (PIDM)
ON (Target.PIDM = Source.PIDM)
WHEN MATCHED THEN
    [UPDATE STATEMENT]
WHEN NOT MATCHED THEN
    [INSERT STATEMENT]

Это дает мне ошибкус жалобой на то, что мне не хватает ключевого слова «USING», а также с другой жалобой на утверждение WHEN ...

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

Используйте MERGE вместо

1 голос
/ 03 июня 2011

В PL / SQL вы должны использовать SQL%ROWCOUNT вместо @@ROWCOUNT:

UPDATE (...);
IF SQL%ROWCOUNT = 0 THEN
    INSERT (...);
END IF;

Или вы можете использовать SQL%NOTFOUND, что, на мой взгляд, прощеЧтобы понять намерение:

UPDATE (...);
IF SQL%NOTFOUND THEN
    INSERT (...);
END IF;

Что касается команды MERGE, то синтаксис Oracle немного отличается от SQL Server, с которым связан @zerkms.В частности, вы должны исключить слово «AS» из псевдонима таблицы и не указывать столбцы после предложения «USING».Кроме того, в Oracle SQL предложение FROM является обязательным.Вы можете использовать таблицу DUAL для имитации поведения SQL Server.Собираем все вместе (это не проверено):

MERGE INTO tableName Target
USING (SELECT :NEW.PIDM FROM DUAL) Source
ON (Target.PIDM = Source.PIDM)
WHEN MATCHED THEN
    [UPDATE STATEMENT]
WHEN NOT MATCHED THEN
    [INSERT STATEMENT]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...