2016-06-22 9 views
0

タイトルが言ったとおりに、既存のテーブルに基づいてタイプをOracleに作成したいとします。既存のテーブルに基づいてタイプを作成

Iは以下の通りでした:

create or replace type MY_NEW_TYPE as object(one_row EXISTING_TABLE%rowtype); 

目指しEXISTING_TABLEテーブルのサンプル列を含むテーブルを返す関数にこれを使用できるようにすることである。

create or replace function OUTPUT_FCT() return MY_NEW_TYPE AS 
... 

答えて

3

テーブルから行を返す関数を作成するだけであれば、型を作成せずに次のようなことを試すことができます。

セットアップ:

create table EXISTING_TABLE(a number, b varchar2(100)); 
insert into EXISTING_TABLE values (1, 'one'); 

機能:

create or replace function OUTPUT_FCT return EXISTING_TABLE%rowtype AS 
    retVal EXISTING_TABLE%rowType; 
begin 
    select * 
    into retVal 
    from EXISTING_TABLE 
    where rownum = 1; 
    -- 
    return retVal; 
end; 

関数呼び出し

SQL> begin 
    2  dbms_output.put_line(OUTPUT_FCT().a); 
    3  dbms_output.put_line(OUTPUT_FCT().b); 
    4 end; 
    5/
1 
one 

しかし、私はRではないだろうselect *のようなものは本当に危険なものになる可能性があるので、このようなアプローチをとってください。必要なフィールドを持つ型を定義し、必要な列を明示的に照会することをお勧めします。

+0

上記のコードには、次のようにコンパイルエラーはありません。 – Petar

2

いいえ、できません。コンパイルエラーが発生します:

create or replace type my_new_type as object(one_row t42%rowtype); 
/

Type MY_NEW_TYPE compiled 
Errors: check compiler log 

show errors 

Errors for TYPE STACKOVERFLOW.MY_NEW_TYPE: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------------- 
0/0  PL/SQL: Compilation unit analysis terminated 
1/36  PLS-00329: schema-level type has illegal reference to MYSCHEMA.T42 

オブジェクト型の各フィールドを指定する必要があります。また、手動でデータ型を指定する必要があります。table.column%typeは使用できません。

データ・ディクショナリの列とデータ型の情報に基づいて型を動的に作成できますが、これは(うまくいけば)一回限りのタスクであり、実行時に行うことではないので、それの価値があるようです。

テーブルのrowtypeに基づいてPL/SQLテーブルタイプを作成することはできますが、プレーンSQLではなくPL/SQLから返す関数を呼び出すことしかできません。テーブルコレクション式などがあります。単一のサンプル行だけを返す場合は、テーブルではなくレコードを返すことができますが、同じことが適用されます。また、テーブルの構造と一致する可能性のある参照カーソルを返す関数を持つこともできますが、それをテーブルとして扱うことはできません。

Read more about object type creation in the documentation。特に、属性セクションとデータタイプセクション。

関連する問題