2017-01-24 6 views
0

テーブルの%rowtypeレコードと同じ(同じフィールド)のスキーマレベルタイプ(C++コードから参照するために)が必要です。悲しいことに、私は、コードから直接%の行型を使用することはできませんとだけテーブルの%rowtypeに一致するオブジェクトタイプを作成する方法はありますか?

create type blabla is object... 

として宣言された名前付きの型を扱うことができます自動でこれを作成する方法はありますか私は手動で作成し、それぞれのサポートオブジェクトタイプする必要がありますテーブル私はこれが必要ですか?

答えて

1

オブジェクト型はスキーマ・レベルのデータベース・オブジェクトです。つまり、SQLデータ型および構文(PL/SQLで実装されている部分を除き、メソッド)に準拠する必要があります。

%ROWTYPEと%TYPEは両方ともPL/SQL属性であるため、オブジェクト型の属性を定義するときには使用できません。

私も知っています。

表をミラーリングするオブジェクト型を作成する必要がある場合は、多くの表に対して、user_tab_columnsに対する問合せでジェネレータを記述することはあまり難しくありません。

+0

はい、ジェネレータも私が考えていたものでした。ちょうど非常に奇妙なそれはボックスの外で行うことができない感じ... – Zeks

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

あなたはこれらのテーブルの列に関する情報を取得し、作成したコードの一部を構築するために(あなたの必要性に応じて、またはALL_TAB_COLUMNS、DBA_TAB_COLUMNS)USER_TAB_COLSを使用することができますあなたが必要とするタイプ。

これは、あなたがテーブルに遭遇する可能性の異なる種類を扱うように洗練させる出発点と、次のようになります。

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) 
) 
:これは、上記の表のために、次のタイプを与える

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 

関連する問題