Могу ли я использовать INSERT ALL с несколькими переменными типа записи? - PullRequest
4 голосов
/ 10 июля 2019

Учитывая блок PL / SQL, где у меня есть доступ к 2 переменным типа записи, я хочу вставить эти 2 записи в одну таблицу в одном операторе, но мои попытки использовать INSERT ALL пока не увенчались успехом.Можно ли вообще использовать INSERT ALL с переменными записи?

Вот код, который работает с использованием специальных вставок:

DECLARE
    mProperty1 MyTable%ROWTYPE;
    mProperty2 MyTable%ROWTYPE;
    ...
BEGIN
    ...
    INSERT INTO MyTable VALUES mProperty1;
    INSERT INTO MyTable VALUES mProperty2;
    ...
END;

Если я пытаюсь преобразовать инструкцию в INSERT ALL, однако, происходит сбой с сообщением об ошибке:

DECLARE
    mProperty1 MyTable%ROWTYPE;
    mProperty2 MyTable%ROWTYPE;
    ...
BEGIN
    ...
    INSERT ALL
          INTO MyTable VALUES mProperty1
          INTO MyTable VALUES mProperty2
          SELECT 1 FROM DUAL;
    ...
END;

ORA-06550: строка 14, столбец 60: PLS-00382: выражение имеет неправильный тип ORA-06550: строка 13, столбец60: PLS-00382: выражение имеет неправильный тип ORA-06550: строка 13, столбец 60: PL / SQL: ORA-00904:: неверный идентификатор ORA-06550: строка 12, столбец 7: PL / SQL: оператор SQL игнорируется

Я что-то упускаю из виду?Есть ли способ заставить это утверждение работать?

1 Ответ

1 голос
/ 11 июля 2019

Я пытался использовать разные методы, но мне удалось только следующее:

Метод 1:

Использование определенных имен записей из %ROWTYPE поля

DECLARE
    mProperty1 MyTable%ROWTYPE;
    mProperty2 MyTable%ROWTYPE;
BEGIN
    mProperty1.COL1 := 1;
    mProperty2.COL1 := 2;
    INSERT ALL 
    INTO  MyTable VALUES (mProperty1.col1)
    INTO  MyTable VALUES (mProperty2.col1)
    SELECT 1 FROM DUAL;
END;
/
-- may be bad choice but you can use like this

Метод 2:

Если вас беспокоит производительность, вы также можете использовать этот метод:

DECLARE
    TYPE mProperty_TYPE IS TABLE OF MyTable%ROWTYPE;
    mProperty mProperty_TYPE;
BEGIN
    mProperty := mProperty_TYPE();
    mProperty.EXTEND(2);
    mProperty(1).COL1 := 3;
    mProperty(2).COL1 := 4;
    FORALL I IN 1..mProperty.COUNT 
    INSERT INTO MyTable VALUES mProperty(I);
END;
/

дБ <> демо fiddle

...