Основная масса PL / SQL INSERT в таблицу с неизвестной структурой - PullRequest
0 голосов
/ 01 декабря 2018

Можете ли вы выполнить массовую вставку FORALL в таблицу с неизвестной структурой?Это означает, что вы можете динамически построить команду INSERT в конструкции FORALL, не зная количества полей во время компиляции?

Число и имя полей извлекается во время выполнения и сохраняется в коллекции:

TYPE RowType is TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(50);
TYPE TableType is TABLE OF RowType;
my_table TableType;

Таким образом, во время выполнения my_table может быть заполнен таким образом, например:

my_table(1)('FIELD1') = 'VALUE1A';
my_table(1)('FIELD2') = 'VALUE2A';
my_table(1)('FIELD3') = 'VALUE3A';
my_table(2)('FIELD1') = 'VALUE1B';
my_table(2)('FIELD2') = 'VALUE2B';
my_table(2)('FIELD3') = 'VALUE3B';
my_table(3)('FIELD1') = 'VALUE1C';
my_table(3)('FIELD2') = 'VALUE2C';
my_table(3)('FIELD3') = 'VALUE3C';

Операторы вставки, которые должны выполняться массово, поэтому:

INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1A,VALUE2A,VALUE3A);
INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1B,VALUE2B,VALUE3B);
INSERT INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1C,VALUE2C,VALUE3C);

EDIT: Вы вообще читали вопросы или просто прочитали пару слов в названии?Связанный вопрос спрашивает, как связать переменную, этот вопрос спрашивает, как массово выпускать динамические операторы.Да, в обоих вопросах есть слова «вставить» и «таблица».

1 Ответ

0 голосов
/ 02 декабря 2018

Нет, вы не можете динамически создавать и выполнять оператор FORALL...INSERT... динамически.Вы можете , однако динамически создать оператор INSERT в форме:

INSERT ALL
  INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1A,VALUE2A,VALUE3A)
  INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1B,VALUE2B,VALUE3B)
  INTO TABLENAME (FIELD1,FIELD2,FIELD3) VALUES (VALUE1C,VALUE2C,VALUE3C)

Или, если данные, которые вы хотите вставить в вашу таблицу, находятся в другой таблице, вы можете найти *Оператор 1007 *, например

INSERT INTO TABLENAME
  SELECT FIELD1, FIELD2, FIELD3
    FROM OTHER_TABLE
    WHERE something <> something_else

, или вы можете использовать оператор MERGE, аналогичный

MERGE INTO TABLENAME t
  USING (SELECT FIELD1, FIELD2, FIELD3 FROM OTHER_TABLE) o
    ON (t.FIELD1 = o.FIELD1)
  WHEN NOT FOUND THEN
    INSERT (FIELD1, FIELD2, FIELD3) VALUES (o.FIELD1, o.FIELD2, o.FIELD3)

, который будет выполнять массовую вставку на основе данных, указанных в USINGпредложение и критерии соответствия в предикате ON.

Таким образом, могут быть способы сделать то, что вы хотите, но не зная специфики источника ваших данных и того, как вы манипулируете этими данными перед вставкойВ вашей базе данных сложно сказать, будет ли применен какой-либо из них.

Удачи.

...