Горячо передать OLDROW и NEWROW хранимой процедуре в триггере DB2?

У меня есть куча триггеров по таблицам в DB2 для iseries. Они напрямую пишут в другие таблицы, но меня попросили изменить их, чтобы триггеры вместо этого вызывали что-то еще для записи.

Я знаю, что эта что-то еще часть немного расплывчата. Я бы предположил, что не могу вызвать триггер из другого триггера (поправьте меня, если я ошибаюсь), поэтому я полагаю, что это должна быть хранимая процедура. Есть ли в DB2 что-то вроде "программы", которую я мог бы вызвать вместо этого?

Предполагая, что это хранимая процедура, как мне передать OLDROW и NEWROW для обработки в SP?

Например, триггер может выглядеть примерно так (конечно, в упрощенном виде):

CREATE TRIGGER MYSCHEMA.WHATEVERTABLE_AFTER_INSERT_TRIGGER
AFTER INSERT ON MYSCHEMA.MYTABLE
REFERENCING NEW AS NEWROW
FOR EACH ROW 
MODE DB2ROW 
SET OPTION  ALWBLK = *ALLREAD , 
ALWCPYDTA = *OPTIMIZE , 
COMMIT = *CS , 
DECRESULT = (31, 31, 00) , 
DFTRDBCOL = *NONE , 
DYNDFTCOL = *NO , 
DYNUSRPRF = *USER , 
SRTSEQ = *HEX   
WHEN ( 1 = 1 ) 

BEGIN ATOMIC

INSERT INTO NEWSCHEMA.NEWTABLE
(
AAA,
BBB,
CCC
)
VALUES
(
NEWROW.AAA,
NEWROW.BBB,
NEWROW.CCC
);

END;

Триггеру просто нужно реплицировать таблицу большую часть времени, поэтому мне иногда нужен доступ к OLDROW, а иногда к NEWROW, а иногда и к тому и другому. Однако я считаю, что это имеет смысл только в контексте триггера, так как мне передать эту информацию в SP?


person ChrisC    schedule 09.12.2014    source источник


Ответы (1)


В DB2 для IBM i...

Каждая хранимая процедура ЯВЛЯЕТСЯ программой и наоборот. Одно из многих преимуществ ОС, являющейся БД.

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

CALL MYSP (NEWROW.*);

Возможно, вы сможете использовать динамический SQL для запроса метаданных и создания динамического вызова.

Но даже если одно из этих действий работает, вам, вероятно, не следует этого делать. Потому что теперь у вас есть зависимость между вызываемым SP и структурой таблицы (как в старомодных RPG). Одна из причин использования SQL заключается в том, чтобы избежать этой зависимости.

Теперь, если вы используете RPG или COBOL для определения своего триггера, то довольно легко передать указатель на буфер триггера, который БД предоставляет программе. Но RPG и COBOL — это языки более низкого уровня по сравнению с SQL.

В чем причина просить «что-то еще» написать?

person Charles    schedule 11.12.2014