Есть ли способ создать тип объекта, соответствующий% rowtype таблицы?

Мне нужен тип уровня схемы (чтобы ссылаться на него из кода C ++), который всегда будет таким же (те же поля), что и запись% rowtype таблицы. К сожалению, я не могу использовать% rowtype напрямую из кода и могу работать только с именованными типами, объявленными как

create type blabla is object...

Есть ли способ создать это автоматически или мне придется вручную создавать и поддерживать тип объекта для каждой таблицы, для которой это нужно?

0

Решение

Типы объектов — это объекты базы данных уровня схемы, что означает, что они должны соответствовать типам данных и синтаксису SQL (за исключением тех частей, которые реализованы в PL / SQL: методы).

% ROWTYPE и% TYPE являются атрибутами PL / SQL и поэтому не могут использоваться при определении атрибутов типа объекта.

Я знаю — меня это тоже раздражает.

Если вам нужно создать тип объекта, который отражает таблицу, для многих таблиц не составит труда написать генератор с запросом к user_tab_columns.

1

Другие решения

Вы не можете использовать %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)
)
1

По вопросам рекламы [email protected]