Получить тип элемента 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'
Другие вопросы по тегам