#oracle #if-statement #plsql #triggers #conditional
#Oracle #if-оператор #plsql #триггеры #условные операторы
Вопрос:
Я создаю триггер в PLSQL:
CREATE OR REPLACE TRIGGER ALS_INT_WH_CFA_EXT_AIUDR
AFTER DELETE OR INSERT OR UPDATE
ON WH_CFA_EXT
FOR EACH ROW
DECLARE
v_wh NUMBER := NULL;
BEGIN
v_wh := :new.wh;
IF (v_wh IN (SELECT wh
FROM wh
WHERE wh != physical_wh))
THEN
INSERT INTO WH_MFQUEUE_TEST (SEQ_NO,
WH,
MESSAGE_TYPE,
FAMILY,
PUB_STATUS,
TRANSACTION_NUMBER,
TRANSACTION_TIME_STAMP)
VALUES (WH_MFSEQUENCE.NEXTVAL,
:new.wh,
'whmod',
'WH',
'U',
1,
SYSDATE);
END IF;
END;
/
Это должно привести к ошибке:
Ошибка (7,13): PLS-00405: подзапрос не разрешен в этом контексте
Как мне использовать подзапрос в этом случае?
Ответ №1:
-
Вы должны сохранить результат вашего запроса в переменной.
-
Вы должны поместить
v_wh
-Condition в свой where-block
Пример:
DECLARE
v_result NUMBER;
BEGIN
-- [...]
SELECT COUNT(*) INTO v_result FROM wh WHERE wh != physical_wh AND wh = v_wh;
IF v_result > 0
THEN
--[...]
Ответ №2:
Вам нужно использовать временную переменную:
SELECT wh INTO tmpvar FROM wh WHERE wh != physical_wh;
if (v_wh in tmpvar) THEN ...
Подзапросы могут использоваться только в операторах SQL, чего нет в операторе IF.
Ответ №3:
Вы можете проверить наличие строк, wh.wh = :new.wh and wh != physical_wh
используя отдельную целочисленную переменную.
CREATE OR REPLACE TRIGGER als_int_wh_cfa_ext_aiudr AFTER
DELETE OR INSERT OR UPDATE ON wh_cfa_ext
FOR EACH ROW
DECLARE
v_wh INT;
BEGIN
SELECT CASE WHEN EXISTS
( select 1 v_wh
FROM wh WHERE wh != physical_wh
AND wh = :new.vh ) THEN 1 ELSE 0 END INTO v_wh from dual;
IF v_wh = 1 THEN
INSERT INTO wh_mfqueue_test (
seq_no,wh,message_type,family,pub_status,transaction_number,
transaction_time_stamp
) VALUES (
wh_mfsequence.NEXTVAL,:new.wh,'whmod','WH','U',1,SYSDATE
);
END IF;
END;
/