2016-01-01 3 views
4

J'ai créé deux types personnalisés dans SQL. Le premier est juste un type minimal, pour un exemple concis.Comment référencer une ligne de type personnalisé dans le déclencheur

CREATE OR REPLACE TYPE TestType FORCE AS OBJECT 
(
    title VARCHAR(50) 
); 
/

Le deuxième type est un type de journal du premier type. Ce type est utilisé pour enregistrer les modifications du premier type.

CREATE OR REPLACE TYPE LogType FORCE AS OBJECT 
(
    title VARCHAR(50), 
    TestRef REF TestType 
); 
/

Et les tables:

CREATE TABLE TestTable OF TestType; 
CREATE TABLE LogTable OF LogType; 

Le déclencheur:

CREATE TRIGGER UpdateLog 
BEFORE UPDATE OF title ON TestTable 
REFERENCING new as newrow old as oldrow 
FOR EACH ROW 
WHEN (newrow.title != oldrow.title) 
BEGIN 
    INSERT INTO LogTable VALUES(:oldrow.title, :newrow); 
END UpdateLog; 
/ 

maintenant, comme mentionné précédemment, je voudrais avoir déclencheur sur TestTable, qui veillerait sur les changements de ligne . La partie suivante fonctionne, le problème se produit lorsque je veux insérer les modifications dans la table de journal. Insérer null à la place de la référence fonctionne, mais essayer d'insérer quelque chose de similaire à: newrow ou ref (: newrow) ne le fait pas. Il jette une variable de liaison incorrecte (PLS-00049). Donc, la question est, comment puis-je référencer le newrow dans la table de journal?

Répondre

2

utilisation MAKE_REF et la pseudo-colonne OBJECT_ID:

CREATE OR REPLACE TRIGGER UpdateLog 
BEFORE UPDATE OF title ON TestTable 
REFERENCING new as newrow old as oldrow 
FOR EACH ROW 
WHEN (newrow.title != oldrow.title) 
BEGIN 
    INSERT INTO LogTable VALUES(:oldrow.title, make_ref(TestTable, :newrow.object_id)); 
END UpdateLog; 
/