Мне нужен тип уровня схемы (чтобы ссылаться на него из кода C ++), который всегда будет таким же (те же поля), что и запись% rowtype таблицы. К сожалению, я не могу использовать% rowtype напрямую из кода и могу работать только с именованными типами, объявленными как
create type blabla is object...
Есть ли способ создать это автоматически или мне придется вручную создавать и поддерживать тип объекта для каждой таблицы, для которой это нужно?
Типы объектов — это объекты базы данных уровня схемы, что означает, что они должны соответствовать типам данных и синтаксису SQL (за исключением тех частей, которые реализованы в PL / SQL: методы).
% ROWTYPE и% TYPE являются атрибутами PL / SQL и поэтому не могут использоваться при определении атрибутов типа объекта.
Я знаю — меня это тоже раздражает.
Если вам нужно создать тип объекта, который отражает таблицу, для многих таблиц не составит труда написать генератор с запросом к user_tab_columns.
Вы не можете использовать %ROWTYPE
в построении типа объекта, но вы можете получить код для построения типов на основе таблиц без ручного сканирования структуры таблицы и записи типа.
Скажем, у вас есть такие таблицы:
create table someTypesTable( n number(10),
n2 number(7, 3),
v varchar2(16),
d date,
t timestamp)
create table someOtherTypesTable( n number,
c clob,
t timestamp(3))
Ты можешь использовать USER_TAB_COLS (или ALL_TAB_COLUMNS, DBA_TAB_COLUMNS, в зависимости от ваших потребностей), чтобы получить информацию о столбцах этих таблиц и создать фрагмент кода, который создает нужные вам типы.
Это может быть отправной точкой, которая будет улучшена для обработки различных типов, которые вы можете встретить в таблицах:
select 'create or replace type tTab' || table_name ||
' as object ( ' ||
listagg(
column_name || ' ' ||
data_type ||
case when data_type = 'NUMBER' and data_precision is not null then '(' || data_precision || ',' || data_scale || ')'
when data_type = 'VARCHAR2' then '(' || data_length ||')'
end
, ', ' ) within group ( order by column_id) ||
')'
from user_tab_cols
where table_name in ('SOMETYPESTABLE', 'SOMEOTHERTYPESTABLE')
group by table_name
Для приведенных выше таблиц это дает следующие типы:
CREATE OR REPLACE TYPE tTabSOMEOTHERTYPESTABLE AS OBJECT
(
N NUMBER,
C CLOB,
T TIMESTAMP(3)
)
CREATE OR REPLACE TYPE tTabSOMETYPESTABLE AS OBJECT
(
N NUMBER(10, 0),
N2 NUMBER(7, 3),
V VARCHAR2(16),
D DATE,
T TIMESTAMP(6)
)