Получить тип элемента VARRAY, используя атрибут TYPE
Я хочу, чтобы получить тип элементов хранилищ Varray через атрибут типа или ЛЮБОЙ обходной путь.
например, наш тип определяется так
CREATE TYPE "READINGS" AS VARRAY (200) OF NUMBER(21, 6);
(показания варрей с элементами типа number(21,6)
)
READINGS
столбец в таблице INTERVALS
, INTERVALS
является центральной таблицей, и у нас есть пакетные процессы на INTERVALS
которые выполняют sql хранимые процедуры. В хранимой процедуре у нас есть жестко закодированные объявления переменных, отображающие READING
Тип элемента типа VArray, который NUMBER(21, 6)
например, процедура store имеет объявления переменных вроде
CONSUMPTION NUMBER(21, 6);
всякий раз, когда определение Varray изменяется или Varray удаляется и воссоздается с другим размером и точностью, например вместо number(21,6)
изменено на number(25,9)
нам нужно изменить объявления переменных во всех процедурах хранилища пакетных процессов. Все, что я ищу, - это объявление переменной CONSUMPTION, ссылка на тип элемента VArray. Я хочу что то подобное
CONSUMPTION INTERVALS.READINGS.COLUMN_TYPE%TYPE;
(я хочу что-то вроде этого, обратитесь к типу элементов, хранящихся в Varray)
2 ответа
Почему вы создаете таблицу с VARRAY
колонка на первом месте? Как правило, было бы гораздо разумнее создать отдельную таблицу для READINGS
с внешним ключом, который позволяет связать строки обратно к INTERVALS
Таблица. Тогда вы могли бы достаточно легко объявить столбцы типа READINGS.COLUMN_NAME%TYPE
,
Коллекции чрезвычайно полезны в PL/SQL. Я никогда не видел случая, чтобы они улучшили стандартный нормализованный подход к моделированию данных. Я видел множество случаев, когда включение коллекций в вашу модель данных усложняло работу с вашей моделью данных, а ваш код - труднее писать и поддерживать.
Если вы не хотите исправлять модель данных, вы можете
- Объявить
SUBTYPE
или упакованная переменная типаNUMBER(21, 6)
что вы используете в качестве типа для объявлений переменных. Вы должны будете изменить это определение, если и когда вы измените объявлениеVARRAY
тип. - Создать тип объекта с одним атрибутом (
NUMBER(21,6)
) и определитьVARRAY
на основе этого типа объекта. Затем вы можете объявить экземпляры типа объекта в вашем коде.
Это не обязательное решение, но вы можете получить строку определения типа для дальнейшего использования в динамическом SQL
SELECT
regexp_substr(text, 'VARRAY.*?OF\s+(.+?)(;|\s)*$', 1, 1, 'i', 1)
FROM user_source
WHERE name = 'READINGS'