2009-06-03 9 views
2

J'ai vu beaucoup de questions similaires & réponses, mais ils ont utilisé d'autres astuces spécifiques à DB, ou l'ont fait dans le code, etc. Je suis à la recherche d'un fichier batch SQL direct solution (si elle existe).Charger deux tables liées dans une base de données Oracle

J'ai deux tables avec une relation parent/enfant, appelez-les Exécute & Run_Values.
Exécute a PK "auto" généré, runID (une séquence & un déclencheur), et deux colonnes, Model_Type & Temps qui identifient également de manière unique la ligne (imposée avec une contrainte). Pour chaque ligne de Run, il y a beaucoup d'entrées dans Run_Values, qui a deux colonnes, RunId & Value.

Je voudrais créer quelque chose comme ceci à partir du processus qui rend les données (mélange de sql je sais existe et SQL que je voudrais lui):

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. 

Toutes les pensées, les références, etc. sont appréciés.

Répondre

4

L'astuce consiste à utiliser le CURRVAL de la séquence. Même s'il est défini dans un déclencheur de base de données, vous pouvez simplement l'utiliser.

Un exemple:

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. 

Cordialement, Rob .

+0

Merci - une question. Que se passe-t-il si un autre processus/session crée un nouveau modèle alors que le processus/la session en cours insère les résultats du précédent? Le currval de cette session/transaction est-il seulement? – Marc

+0

Bonne question, Marc. Oui, CURRVAL est pour la session, ne sera pas affecté par d'autres sessions. – spencer7593

+0

Oui, currval ne fonctionne que pour la session en cours. Si une autre session insère une nouvelle exécution, elle augmente la séquence, mais la valeur de l'autre session reste la même. –

Questions connexes