Загрузите две связанные таблицы в базу данных Oracle - PullRequest
2 голосов
/ 03 июня 2009

Я видел много похожих вопросов и ответов, но они использовали другие специфические для БД приемы или делали это в коде и т. Д. Я ищу прямое решение для пакетного файла SQL (если оно существует).

У меня есть две таблицы с отношениями родитель / потомок, назовите их Runs & Run_Values.
Runs имеет PK, сгенерированный автоматически, runID (последовательность и триггер) и два столбца Model_Type & Time, которые ТАКЖЕ однозначно идентифицируют строку (обеспечивается ограничением). Для каждой строки в Run есть много записей в Run_Values, которая имеет два столбца, RunId & Value.

Я бы хотел сгенерировать что-то подобное из процесса, который делает данные (я знаю, что существует 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.

Любые мысли, рекомендации и т. Д. Приветствуются.

1 Ответ

4 голосов
/ 03 июня 2009

Хитрость заключается в том, чтобы использовать 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.

С уважением, Роб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...