EXECUTE IMMEDIATE, используя имена столбцов из двойного
В моем пакете у меня есть такая процедура:
PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO T1(SELECT COL.F0, COL.F1 FROM DUAL)';
END IF;
END;
для таблицы T1 мне нужны только два столбца из двойных: COL.F0 & COL.F1.
Когда я выполняю этот оператор, я получаю "COL"."F1" - неверный идентификатор.
В той же процедуре для вставки значений в таблицу T2 мое утверждение может выглядеть так:
EXECUTE IMMEDIATE 'INSERT INTO T2(SELECT COL.F0, COL.F1, COL.F4 FROM
DUAL)';
Я столкнусь с подобной проблемой снова. Можете ли вы предложить мне способ решения этой проблемы без использования предложения INTO?
1 ответ
Во-первых, INSERT AS SELECT
синтаксис не имеет скобок ()
вокруг запроса.
Если вы используете EXECUTE IMMEDIATE, оператор является строкой, выполняемой вне контекста процедуры, поэтому он не может ссылаться на параметры. Вам необходимо указать их как переменные связывания, например:
PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO T1 AS SELECT :1, :2 FROM DUAL'
USING COL.F0, COL.F1;
END;
Однако я хотел бы спросить, нужно ли вам вообще использовать динамический SQL - вы можете запустить вставку напрямую:
PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN
INSERT INTO T1 AS SELECT COL.F0, COL.F1 FROM DUAL;
END;
Кроме того, в этом случае вы можете использовать один оператор вставки строки вместо выполнения "вставить как выбор":
PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN
INSERT INTO T1 VALUES (COL.F0, COL.F1);
END;
PS, если это должно сделать вставку, почему процедура называется "directUpdate"?:)