Подзапрос в значении триггера - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю триггер в 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: подзапрос не разрешен в этом контексте

Как использовать подзапрос в этом случае?

Ответы [ 3 ]

1 голос
/ 17 апреля 2019
  1. Вы должны сохранить свой результат запроса в переменной.

  2. Вы должны поместить v_wh -условие в вас 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
        --[...]
0 голосов
/ 17 апреля 2019

Вы можете проверить наличие строк с помощью 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;
/
0 голосов
/ 17 апреля 2019

Вам нужно использовать временную переменную:

SELECT wh INTO tmpvar FROM wh WHERE wh != physical_wh;
if (v_wh in tmpvar) THEN ...

Подзапросы могут использоваться только в инструкциях SQL, а оператор IF - нет.

...