2009-10-19 14 views
8

私は3つの値を持つオブジェクトを返す関数を持っています。 select文からその関数を呼び出す方法はありますか?各値を別の列にする方法はありますか?私は3つの関数に分けることができますが、値は関連しているので、パフォーマンス上の理由から値を1つにしたいと考えていました。 (だから、Oracleは、クエリのすべての行のための3つのに非常に似た複雑な機能を呼び出す必要はありません。)Oracleのselect文でオブジェクト型を使用

をそうするために:

create type test_obj is object ( 
a NUMBER, 
b NUMBER, 
c NUMBER); 

    create or replace function test_func (
    pinput NUMBER) 
    return test_obj 
    as 
    begin 
    return test_obj(0, 0, 0); 
    end test_func; 

私はselect文からTEST_FUNC呼び出すことができるようにしたいのですが関数を複数回呼び出すことなく、a、b、cを異なる列にすることができます。私は多分このような何かを考えたが、それは動作しません:

select 
    iv.col1, 
    iv.col2, 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     mt.col1, 
     mt.col2, 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

のOracle 10gでこのような何かをする方法はありますか、この問題を解決するための良い方法はありますか?

答えて

9

質問のselect文が機能します。私はインラインビューのエイリアスを含んでいなかったので失敗していました。これは動作します何らかの理由で

select 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

しかし、これはしません:

select 
    func_data.a, 
    func_data.b, 
    func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) 
+0

ありがとうございます!これは私を助けた。 – filiprem

+1

問題は単純に名前解決にあります。 Oracleは、データベース内の表エイリアスまたはシノニム/パッケージとして、SELECT文のドットの前の最初の部分を常に解釈します。また、すべての列をチェックするわけでもありません。だから、あなたはtable_alias.column.attributeでその名前を完全修飾する必要があります – Falco

2

表の別名が動作するように結果を可能にする、コンテキストを設定という名前の結果に結果を配置しますオブジェクトインスタンスとして。エイリアスがなければ、キャストは実際にはテーブルのエイリアスとなる、独自の明示的な参照なしにオブジェクト型インスタンスを処理しないため、失敗します。

関連する問題