Em um disparador do Oracle, posso atribuir novo e antigo a uma variável rowtype?
Eu fui encarregado de implementar vários scripts de gatilho, e eu tenho exemplos de colegas de trabalho para trabalhar. Nesses, eles usam condicionais pl-sql para atualização / inserção / exclusão, juntamente com instruções de inserção gigantescas (em outra tabela). Essas instruções de inserção não variam, exceto se os valores são prefixados com novo ou antigo. Eu pensei que seria esperto e tentaria tornar o meu um pouco mais compacto, usando o seguinte:
DECLARE
vRow SATURN.SPRCMNT%ROWTYPE;
BEGIN
IF UPDATING THEN
vRow := :NEW;
ELSIF INSERTING THEN
vRow := :NEW;
ELSIF DELETING THEN
vRow := :OLD;
END IF;
-- Not the real insert statement
INSERT INTO blah
(columns)
VALUES
(vRow.somecolumns);
END;
Eu recebo o seguinte de volta do sistema de compilação:
10/13 PLS-00049: bad bind variable 'NEW'
13/13 PLS-00049: bad bind variable 'NEW'
16/13 PLS-00049: bad bind variable 'OLD'
Obviamente, não gosta disso. Existe algo que vai conseguir o que estou tentando? São: new e: old apenas não true rowtypes? Parece estúpido repetir o que é essencialmente o mesmo código 3 vezes, e ainda não consigo descobrir uma maneira melhor. Inferno, eu acho que li que há um limite rígido no tamanho dos gatilhos também. Qualquer ajuda apreciada.
[Edit] Apenas um pensamento, é possível referenciar as palavras-chave UPDATING / INSERTING de alguma forma dentro de um DECODE ()?
Por exemplo, se eu pudesse fazer um DECODE (SOMETHINGVAR, UPDATING,: NEW.column, DELETING,: OLD.column), então eu poderia definir o valor de cada coluna no vRow com uma única instrução.
Eu acho que seria melhor verificar o DELETING primeiro e usar o padrão para os outros dois.
Isso é possível?