有没有办法创建匹配表的%rowtype的Object类型?

时间:2017-01-24 17:05:31

标签: c++ oracle plsql ocilib

我需要一个模式级别类型(从c ++代码引用它),它总是与表的%rowtype记录相同(相同的字段)。遗憾的是,我不能直接从代码中使用%rowtype,只能使用声明为

的命名类型
create type blabla is object...

有没有办法以自动方式创建它,还是我必须为我需要的每个表手动创建和支持对象类型?

2 个答案:

答案 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)
)