Как динамически извлекать именованный столбец из параметра строки в Oracle PL / SQL?

StackOverflow https://stackoverflow.com/questions/1289651

  •  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/ ...или случай /когда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top