2009-07-06 4 views
0

Je ne suis pas un programmeur, mais j'ai pour tâche de copier automatiquement un champ d'une table dans un autre champ de la même table (c'est une longue histoire ... :-)). Cela devrait être fait sur la mise à jour et l'insertion et je ne sais vraiment pas comment s'y prendre. Je dois préciser que les données sont saisies dans la base de données via une interface utilisateur dont nous n'avons pas le code source, et que nous souhaitons effectuer cette modification au niveau de la base de données, en utilisant un déclencheur ou des préférences. J'ai essayé de créer un déclencheur simple qui copiera les valeurs, mais qui est venu avec un message d'erreur. Après avoir googlé l'erreur, j'ai trouvé que je devais créer un paquet qui sera utilisé comme variable. Maintenant je suis vraiment perdu !!!! :-)Copier des champs dans Oracle

Je tiens également à souligner que j'ai besoin d'une solution qui mettra à jour ce champ automatiquement à partir de maintenant, mais ne remplacera pas les données qui existent déjà dans la colonne.

Quelqu'un pourrait me montrer la manière la plus simple et la plus simple de faire toute cette procédure? J'ai vraiment besoin d'une approche 'Guide pour les nuls'.

Merci, David

+0

Il serait utile que vous ayez posté le message d'erreur complet, pas seulement un résumé de celui-ci. Aussi, s'il vous plaît poster le code du déclencheur que vous avez essayé d'écrire, et comment vous avez essayé de l'installer. – skaffman

+0

Salut David - vous devriez accepter la réponse de Vincent si cela a fonctionné pour vous. –

Répondre

1

Un déclencheur simple, sera suffisant si les deux champs sont sur la même table.

Tenir compte:

SQL> CREATE TABLE t (ID NUMBER, source_col VARCHAR2(10), dest_col VARCHAR2(10)); 

Table created 
SQL> CREATE OR REPLACE TRIGGER trg_t 
    2  BEFORE INSERT OR UPDATE OF source_col ON t 
    3  FOR EACH ROW 
    4 BEGIN 
    5  IF :old.dest_col IS NULL THEN 
    6  :NEW.dest_col := :NEW.source_col; 
    7  END IF; 
    8 END; 
    9/

Trigger created 

Nous vérifions si le déclencheur fonctionne pour insérer puis mettre à jour (la valeur que nous insérons sera conservée):

SQL> INSERT INTO t(ID, source_col) VALUES (1, 'a'); 

1 row inserted 
SQL> SELECT * FROM t; 

     ID SOURCE_COL DEST_COL 
---------- ---------- ---------- 
     1 a   a 
SQL> UPDATE t SET source_col = 'b'; 

1 row updated 
SQL> SELECT * FROM t; 

     ID SOURCE_COL DEST_COL 
---------- ---------- ---------- 
     1 b   a 

Edit: Je mis à jour le déclencheur pour prendre en compte l'exigence que les données existantes sur dest_col soient conservées.

+0

Bonne réponse Vincent. Peut-être vaut-il la peine d'ajouter un test pour savoir si le champ est déjà rempli car c'était quelque chose qu'il demandait ... peut-être "if: NEW.dest_col est nul alors ..." –

+0

@Nick Pierpoint: merci Nick J'ai mis à jour le code du trigger . –

0

Si vous avez juste besoin de la nouvelle colonne pour afficher exactement les mêmes données que l'ancienne colonne, je pense (si vous utilisez Oracle 11g) que vous pouvez créer une colonne virtuelle.

Il existe un exemple here.

Questions connexes