2011-06-28 10 views
1

私はSQL文を実行するプログラムを持っています。トランザクション内では、と同じ sysdateを使用していくつかのテーブルを更新したいと思います。例えば、 。これらの3つの文がトランザクション内で実行されている場合は、それぞれが使用している「SYSDATE」はこの文ではなく、実行されているとして、我々は現在にあるものは何でも、タイムスタンプになります**同じ** sysdateを使用して複数のSQL文を実行する方法はありますか?

update table1 set some_col = 'updated' where some_other_col < sysdate; 
delete from table2 where some_col < sysdate; 
insert into table3 (col1, col2) select c1, c2 from table4 where some_col < sysdate; 

(トランザクションで、次の3つの文を実行します)取引の開始時に

ストアドプロシージャを作成し、最初にPL/SQLを使用して変数にsysdateを選択しますが、外部プログラムからSQL文を実行する方が好きです。

+0

...セッションのために設定あなたのNLS_DATE_FORMATを調整する必要がある場合があります。それぞれのクエリは、あなたが上でそれをやっているのsysdateのためにわずかに異なるdatetimeを持っています。私はあなたがそのストアドプロシージャを作る必要があると思う。 – Limey

答えて

5

私は、PL/SQLを使用して、 変数にSYSDATEを選択し、最初は、ストアドプロシージャと を作成することもできますが、私はちょうど 外部プログラムから

をSQL文を実行するために を好みます(未テスト)のようなものではなく、ストアドプロシージャの無名ブロックを使用します。

declare 
    v_sysdate date := sysdate; 
begin 
    update table1 set some_col = 'updated' where some_other_col < v_sysdate; 
    delete from table2 where some_col < v_sysdate; 
    insert into table3 (col1, col2) select c1, c2 from table4 where some_col < v_sysdate; 
    commit; 
exception 
    when others then 
    rollback; 
    raise; 
end; 
+0

これは通常のSQLとまったく同様に(つまり外部プログラムから)実行/実行できますか? – Gerrat

+0

...ストアドプロシージャとストアドプロシージャとの間に違いはないとは思いますが、ストアドプロシージャとは異なり、SQL以外のPL/SQLであり、外部プログラムによって(直接)実行できません。 – Gerrat

+0

ストアドプロシージャと無名ブロックの間には多くの違いがあります。 「外部プログラム」はこれを直接実行できません(ただし、個々のDML文を実行できます)。 – tbone

0

それはトンになっていますように私はそれが働いて怖いです彼は時間が各クエリで再計算されます。プログラムの変数にタイムスタンプを格納し、その変数をクエリで使用するだけです。

0

どの外部プログラムですか?あなたはSQL * Plusを使用している場合、これは動作します:

var d char(50) 
begin select sysdate into :d from dual; end; 
/

update table1 set some_col = 'updated' where some_other_col < :d; 
delete from table2 where some_col < :d; 
insert into table3 (col1, col2) select c1, c2 from table4 where some_col < :d; 

をあなたは、私はあなたがあなた自身の質問に答えだと思う