2009-06-03 17 views
2

多くの類似の質問&の回答がありましたが、他のDB固有のトリックを使用したり、コードなどで行っています。まっすぐなSQLバッチファイル解決策(存在する場合)。Oracleデータベースに関連する2つのテーブルをロードする

私は親子関係を持つ2つのテーブルを持っています。それはRuns & Run_Valuesと呼ばれます。
Runsには、自動生成されたPK、runID(シーケンス&トリガー)と2つの列Model_Type &があります(制約が適用されている行を一意に識別する時刻)。 Runの各行には、RunId & Valueの2つの列を持つRun_Valuesに多数のエントリがあります。

私は(私はそれを好きなSQLのミックス私は知っているが存在し、SQL)のデータを作るプロセスからこのような何かを生成したいと思います:

insert into Runs (Model_Type, Time) values ('model1', to_date('01-01-2009 14:47:00', 'MM-DD-YYYY HH24:MI:SS')); 
set someVariable = SELECT runId FROM Runs WHERE Model_Type like 'model1' and Time = to_date('01-01-2009 14:47:00', 'MM-DD-YYYY HH24:MI:SS')); 
insert into Run_Values (run_id, Value) values (someVariable, 1.0); 
etc - lots more insert statements with Values for this model run. 

任意の考え、参考文献など感謝しています。

答えて

4

トリックは、シーケンスのCURRVALを使用することです。データベーストリガーに設定されていても、それを使用することができます。

例:

SQL> create table runs 
    2 (runid  number 
    3 , model_type varchar2(6) 
    4 , time  date 
    5 ) 
    6/

Table created. 

SQL> create sequence run_seq start with 1 increment by 1 cache 100 
    2/

Sequence created. 

SQL> create trigger run_bri 
    2 before insert on runs 
    3 for each row 
    4 begin 
    5 select run_seq.nextval 
    6  into :new.runid 
    7  from dual 
    8 ; 
    9 end; 
10/

Trigger created. 

SQL> create table run_values 
    2 (run_id number 
    3 , value number(3,1) 
    4 ) 
    5/

Table created. 

SQL> insert into runs (model_type, time) values ('model1', to_date('01-01-2009 14:47:00', 'mm-dd-yyyy hh24:mi:ss')); 

1 row created. 

SQL> insert into run_values (run_id, value) values (run_seq.currval, 1.0); 

1 row created. 

SQL> insert into run_values (run_id, value) values (run_seq.currval, 2.0); 

1 row created. 

SQL> insert into runs (model_type, time) values ('model2', to_date('01-01-2009 15:47:00', 'mm-dd-yyyy hh24:mi:ss')); 

1 row created. 

SQL> insert into run_values (run_id, value) values (run_seq.currval, 3.0); 

1 row created. 

SQL> insert into run_values (run_id, value) values (run_seq.currval, 4.0); 

1 row created. 

SQL> insert into run_values (run_id, value) values (run_seq.currval, 5.0); 

1 row created. 

SQL> select * from runs 
    2/

    RUNID MODEL_ TIME 
---------- ------ ------------------- 
     1 model1 01-01-2009 14:47:00 
     2 model2 01-01-2009 15:47:00 

2 rows selected. 

SQL> select * from run_values 
    2/

    RUN_ID  VALUE 
---------- ---------- 
     1   1 
     1   2 
     2   3 
     2   4 
     2   5 

5 rows selected. 

よろしく、 ロブ。

+0

ありがとうございます。現在のプロセス/セッションが前のプロセス/セッションの結果を挿入している間に、別のプロセス/セッションが新しいモデルを作成するとどうなるでしょうか?このセッション/トランザクションのcurrvalのみですか? – Marc

+0

良い質問、Marc。はい、CURRVALはセッション用で、他のセッションの影響を受けません。 – spencer7593

+0

はい、currvalは現在のセッションでのみ動作します。別のセッションが新しい実行を挿入すると、シーケンスが増加しますが、他のセッションのcurrvalは同じままです。 –

関連する問題