オブジェクト型の構築には%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
はい、ジェネレータも私が考えていたものでした。ちょうど非常に奇妙なそれはボックスの外で行うことができない感じ... – Zeks