Как динамически извлекать именованный столбец из параметра строки в Oracle PL / SQL?
-
18-09-2019 - |
Вопрос
У меня есть такая процедура, как эта:
PROCEDURE foo(
p_field_name IN VARCHAR2,
p_record IN table%rowtype )
IS
v_value VARCHAR2(100);
BEGIN
EXECUTE IMMEDIATE 'SELECT p_record.' || p_field_name || ' FROM dual' INTO v_value;
END
Oracle жалуется , что p_record.my_field_name
является недопустимым идентификатором, что наводит меня на мысль, что немедленное выполнение выполняется в каком-то другом контексте.
Возможно ли сделать то, что я пытаюсь сделать выше?
Решение
То, что вы делаете в EXECUTE IMMEDIATE, должно быть выполнимо в любом контексте.Ваш пример не подходит для этого, поскольку это было бы невыполнимо вне вашей процедуры.
Один из возможных обходных путей - передать идентификатор вместо полной строки и выбрать этот единственный столбец из таблицы.Хотя это может снизить производительность, если использовать его часто.
Другие советы
Что не так с IF /ELSIF
IF p_field_name = 'COL1' THEN v_value := p_record.col1
ELSIF p_field_name = 'COL2' THEN v_value := p_record.col2
...
END IF;
Вы могли бы сгенерировать это событие из SELECT из ALL_TAB_COLUMNS.Может быть, это и некрасиво, но это сработало бы.
Я думаю, то, что вы пытаетесь сделать, невозможно.Немедленное выполнение приказов - это динамическое выполнение SQL.sql statment анализируется не при создании процедуры "foo", а во время выполнения.Для oracle это 'select p_record.' || p_field_name || ' from dual' - это varchar, и p_record тоже.Итак, это объясняет, почему у вас возникла эта ошибка.Решение состоит в том, чтобы написать что-то вроде if/elsif/ ...или случай /когда.