Есть ли способ получить доступ к динамически доступному члену
определенная запись, объект или ссылочный курсор с помощью переменной? Например.
Что-то вроде
get_member(my_object, 'member name');
Или, может быть
my_object.$'member name';
EXECUTE IMMEDIATE не будет работать, поскольку он не работает в рамках моей процедуры.
Позвольте мне кратко объяснить, что я пытаюсь сделать. У меня есть таблица отображения M, которая описывает, как записи таблицы A должны быть преобразованы в записи таблицы B. Отображение должно варьироваться в зависимости от конкретного типа записи в A (заданной A.type). Я хотел выполнить сопоставление примерно так (не совсем, планируя инкапсуляцию логики сопоставления внутри функции потока, но принцип остается схожим):
SELECT
...
CASE
WHEN M.field_1_mapping IS NOT NULL THEN
-- column of A given by value of M.field_1_mapping
ELSE
null -- field_1 not filled for record type
END field_1,
--- etc.
FROM
table_a A,
mapping_table M
WHERE
A.TYPE = M.TYPE
Так что мой вопрос в том, как я могу это сделать. Опять же, я не могу использовать динамический SQL, так как он должен отличаться для каждого типа записи, но если столбец может быть выбран на основе значения поля отображения, тогда будет работать sql obovemention.
Я понимаю, что это просто может быть невозможно (и может идти вразрез с философией разработки PL / SQL), и в этом случае я бы приветствовал любые ваши предложения о том, как решить эту проблему.
P.S .: Полагаю, можно было бы просто жестко закодировать функцию отображения, например ::
FUNCTION get_field(field_key IN VARCHAR(32), a NOCOPY IN table_a%rowtype) RETURN VARCHAR(2000) IS
out VARCHAR2(2000)
BEGIN
-- ...
IF field_key = 'field_1' THEN
RETURN a.field_1; END IF;
-- ..
END;
Но это кажется действительно не элегантным.