我需要一个模式级别类型(从c ++代码引用它),它总是与表的%rowtype记录相同(相同的字段)。遗憾的是,我不能直接从代码中使用%rowtype,只能使用声明为
的命名类型create type blabla is object...
有没有办法以自动方式创建它,还是我必须为我需要的每个表手动创建和支持对象类型?
答案 0 :(得分:1)
对象类型是模式级数据库对象,这意味着它们必须符合SQL数据类型和语法(除了那些在PL / SQL中实现的部分:方法)。
%ROWTYPE和%TYPE都是PL / SQL属性,因此在定义对象类型的属性时无法使用。
我知道 - 它也让我失望。
如果您需要创建一个镜像表的对象类型,对于许多表,使用针对user_tab_columns的查询编写生成器并不会太困难。
答案 1 :(得分: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)
)