c++ - 有没有办法创建一个匹配表的 %rowtype 的对象类型?

标签 c++ oracle plsql ocilib

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

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

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

最佳答案

在构建对象类型时不能使用%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)
)

关于c++ - 有没有办法创建一个匹配表的 %rowtype 的对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41834148/

相关文章:

oracle - 什么情况导致Oracle软件包无效?

Oracle PL/SQL - 如何转义冒号 ( :), 被误解为绑定(bind)变量

Oracle:仅回滚循环的崩溃迭代

c++ - 访问内存中的代码空间?

java - 从 java 中查找 oracle_home 的位置

database - 如何编写用于将日期转换为波斯语 (jalali) 的 Oracle 函数

oracle - 自动列表分区

c++ - 从字节数组快速更新 QPixmap

c++ - 从 ‘char*’ 到 ‘char’ 的无效转换

c++ - .rc 文件中的 TEXTINCLUDE 部分重复