Как использовать входной параметр таблицы для команды MERGE в хранимой процедуре Oracle - PullRequest
0 голосов
/ 08 ноября 2019

В настоящее время я пытаюсь написать хранимую процедуру, которая вставляет или обновляет несколько строк в моей базе данных. Я передаю строки с помощью входного параметра таблицы, но я застрял в том, как передать эти строки команде MERGE.

Эта команда работает нормально:

MERGE INTO dbo.EntryTable a
    USING (SELECT 'abc' "keyColumn", 'def' "valueColumn" FROM DUAL) b
    ON (a."keyColumn" = b."keyColumn")
    WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
    WHEN NOT MATCHED THEN
    INSERT ("keyColumn","valueColumn") 
    VALUES(b."keyColumn",b."valueColumn);

Чтобы получить этов хранимую процедуру я создал таблицу типа:

CREATE OR REPLACE TYPE entry_type AS OBJECT
(
"keyColumn" NVARCHAR2(3), 
"valueColumn" NVARCHAR2(3)
);

CREATE OR REPLACE TYPE entry_type_list AS TABLE OF entry_type;

Но как только я пытаюсь использовать ее в хранимой процедуре, как это:

CREATE OR REPLACE PROCEDURE set_entry_list (entries entry_type_list) AS
BEGIN
    MERGE INTO dbo.EntryTable a
    USING (SELECT * FROM entry_type_list) b
    ON (a."keyColumn" = b."keyColumn")
    WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
    WHEN NOT MATCHED THEN
    INSERT ("keyColumn","valueColumn") 
    VALUES(b."keyColumn",b."valueColumn);
END;

Я получаю ошибки, подобные этойпри создании хранимой процедуры:

ОШИБКА LINE / COL


3/5 PL / SQL: оператор SQL игнорируется

4/26 PL / SQL: ORA-00942: таблица или представление не существует

Я пытался найти документацию о том, как это сделать, но в настоящее время у меня нет идей, где искать.

1 Ответ

1 голос
/ 08 ноября 2019

Если вы используете 11g, вам все равно понадобится оператор table в вашем запросе

SELECT * FROM TABLE( entry_type_list )

Так что ваш оператор MERGE будет выглядеть примерно так:

MERGE INTO dbo.EntryTable a
USING (SELECT * FROM table( entry_type_list ) ) b
ON (a."keyColumn" = b."keyColumn")
WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
WHEN NOT MATCHED THEN
INSERT ("keyColumn","valueColumn") 
VALUES(b."keyColumn",b."valueColumn);
...