2010-12-15 6 views
0

La nécessité de le faire dans une instruction est due à la façon dont le programme gère les instructions sql. L'instruction sql est stockée dans une colonne d'une autre table et exécutée via un ouvert sur un jeu d'enregistrements. L'ouverture répond avec une erreur de caractère invalide si un point-virgule est dans l'instruction. Le scénario: Dans certaines conditions, je souhaite mettre à jour un champ particulier dans un enregistrement de la base de données A, et enregistrer le fait de cette modification dans une table de journal par une insertion.Comment puis-je insérer dans une table et mettre à jour une autre table avec la même instruction sql?

Voici un exemple en utilisant deux déclarations:

update data_table a set field1='new value' where identifier=10; 

insert into log_table (action_taken) 
values('record ' || a.identifier || ' had field1 changed to ' || a.field1); 

Est-il possible de le faire?

+0

Vous pouvez ajouter la deuxième déclaration comme un déclencheur ... – meagar

+1

Vous ne pouvez pas le faire en une seule instruction SQL. Vos options sont le déclencheur suggéré par maigre ou la procédure stockée proposée par krefftc. – BBlake

Répondre

3

Placez-les tous les deux dans une procédure stockée et exécutez l'appel de la procédure stockée.

+0

Malheureusement, je ne veux pas l'enregistrer à moins que le changement est fait par une certaine procédure. Un déclencheur le connecte à chaque changement. Je n'ai pas utilisé de procédures stockées auparavant, sont-ils faciles à apprendre? BTW, j'utilise Oracle sous VB.NET – user543666

0

Effectuez un appel par lots vers le SGDB, vous pouvez faire ce que vous avez fait, si vous utilisez java ou .net les deux commandes sql batch de SQL API.

update data_table a set field1='new value' where identifier=10; 
GO 
insert into log_table (action_taken) 
values('record ' || a.identifier || ' had field1 changed to ' || a.field1); 
GO 

Mais si vous allez faire ces deux opérations en même temps tout le temps, vous devez accepter réponse krefftc parce qu'il est la meilleure façon

2

Je pense que vous cherchez triggers. Sans savoir quelle base de données vous utilisez, je ne peux que deviner.

Voici des informations sur les déclencheurs pour MySQL.

Un déclencheur est lié à une table pour démarrer un événement spécifique, tel que INSERT, UPDATE ou DELETE. Le déclencheur peut ensuite exécuter une ou plusieurs instructions SQL.

Et voici comment vous créez un trigger

0

Si votre base de données se trouve être Oracle vous pouvez être en mesure d'utiliser un bloc anonyme PL/SQL si pour une raison quelconque, vous ne pouvez pas/ne voulez pas créer une procédure stockée:

BEGIN 
update data_table a set field1='new value' where identifier=10; 

insert into log_table (action_taken) 
    values('record ' || a.identifier || ' had field1 changed to ' || a.field1); 
END; 
+0

J'ai effectivement essayé cela dans Oracle, mais j'ai gardé le caractère invalide chaque fois que j'ai inclus un point-virgule. Si vous connaissez un moyen de contourner cela, cela pourrait résoudre mon problème. – user543666

+0

Vous ne le ferez pas si vous utilisez les constructions 'BEGIN' et' END' comme je l'ai suggéré. Cela devrait fonctionner – Dan

Questions connexes