2010-12-15 11 views
0

1つのステートメントでそれを実行する必要があるのは、プログラムがSQLステートメントをどのように処理するかによるものです。 sqlステートメントは別のテーブルの列に格納され、レコードセットのopenによって実行されます。セミコロンがステートメント内にある場合、openは無効な文字のエラーで応答します。1つのテーブルに挿入して同じSQL文を使用して別のテーブルを更新するにはどうすればよいですか?

シナリオ:特定の条件下で、データベースAの1つのレコードの特定のフィールドを更新し、その変更の事実を挿入してログテーブルに記録します。ここで

は二つの文を使用した例です:

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); 

はこれを行う方法はありますか?

+0

2番目のステートメントをトリガーとして追加することができます。 – meagar

+1

単一のSQLステートメントでは実行できません。あなたのオプションは、貧弱に提案されたトリガまたはkrefftcによって提案されたストアドプロシージャです。 – BBlake

答えて

3

両方をストアドプロシージャに入れ、ストアドプロシージャを呼び出します。

+0

残念ながら、特定の手順で変更を加えない限り、ログに記録したくありません。トリガーはすべての変更にそれを記録します。以前はストアドプロシージャを使用していませんでしたが、簡単に学習できますか?ところで、私はVB.NETの下でOracleを使用しています – user543666

0

SQL APIサポートのSQLバッチコマンドの両方をjavaまたは.netで使用している場合、SGDBに対して一括呼び出しを行います。

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 

しかし、あなたは、同時に、この2つの操作を行うには、それは私はあなたがTRIGGERSを探していると思うの最良の方法

2

だから、あなたがkrefftc答えを受け入れる必要があり、すべての時間を予定している場合。どのデータベースを使用しているのかわからないと、私は推測できません。

ここにはMySQLのトリガーに関する情報があります。

トリガーは、INSERT、UPDATE、DELETEなどの特定のイベントで開始するためにテーブルに結び付けられています。トリガは、1つまたは複数のSQL文を実行できます。ここ

そして、あなたはtrigger

0

を作成する方法である、あなたのデータベースがOracleであることを起こる場合は、/作成したくないことはできませんいくつかの理由であれば、あなたは無名PL/SQLブロックを使用することができるかもしれ

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

私は実際にOracleでこれを試しましたが、セミコロンを含めたときは常に無効な文字を取得していました。あなたがそれを回避する方法を知っているなら、それは私の問題を解決するかもしれません。 – user543666

+0

私が提案したように、 'BEGIN'と'それは動作するはずです – Dan

関連する問題