2017-09-26 5 views
-1

Je veux créer un déclencheur qui chaque fois que j'ai un insert sur une table il va effectuer un autre insert sur une autre table dans un schéma diffèrent.Passer une variable à une instruction Insert dans le déclencheur

Le problème est que je veux passer une variable qui contient che schema.table à la requête pour l'insertion. Mais quand j'essaie de faire, j'ai une erreur. C'est ce que j'ai écrit:

CREATE OR REPLACE TRIGGER TRIGGER_TEST 
AFTER INSERT ON MYTABLE 
FOR EACH ROW 
DECLARE 
test VARCHAR2(128); 
BEGIN 
test := "myschema.mytable2" 

Insert into test (a, b, c) 
VALUES(:new.a,:new.b,:new.c); 
END; 

Comment puis-je transmettre correctement la valeur de chaîne de la variable à la requête? C'est possible?

+1

Vous devez utiliser SQL dynamique ('exécuter immediate') pour passer un identifiant dans une requête .. –

+0

Merci pour vos informations. Est-il possible d'avoir un exemple? – NxA

Répondre

1

Vous ne pouvez pas utiliser une variable pour un nom de table ou un nom de colonne, vous devez utiliser SQL dynamique pour cela. En gardant les variables de liaison dans votre déclaration et en utilisant EXECUTE IMMEDIATE vous pouvez contourner que:

CREATE OR REPLACE TRIGGER TRIGGER_TEST 
AFTER INSERT ON MYTABLE 
FOR EACH ROW 
DECLARE 
test VARCHAR2(128); 
BEGIN 
test := "myschema.mytable2" 

EXECUTE IMMEDIATE 'Insert into ' || test || ' (a, b, c) VALUES(:1,:2,:3)' USING :new.a,:new.b,:new.c; 
END; 
+0

Veuillez fournir quelques explications sur ce code, qu'avez-vous fait pour résoudre le problème? Quel était le problème dans le code de Asker? Les réponses de mauvaise qualité sont sujettes à suppression. – Graham

+0

J'ai ajouté des explications sur la façon dont le problème peut être résolu et la façon dont je l'ai résolu. –

+0

Excellent, merci. – Graham