1

コードにユーザー定義型がありますphrase_context_typ。のインスタンスを返す ,functionを呼び出します。phrase_contextphrase_context_typ

ユーザー定義型は次のように定義されます。

CREATE OR REPLACE type phrase_context_typ AS OBJECT (
    context   VARCHAR2(13),
    parent_id NUMBER(10) 
)

と列をVIEW含む がCONTEXTありPARENT_IDます。インスタンスVIEWに存在する値に基づいて、これから選択したいと思います。phrase_context_typ

私は次の方法でこれを行うことができます:

select distinct(col)
    from my_view v
    where v.parent_id = PHRASE_CONTEXT(?, ?, ?, ?, ?).parent_id 
          and
          v.context = PHRASE_CONTEXT(?, ?, ?, ?, ?).context  

これは機能しますが、1回の呼び出しで同等のことを行うことは可能phrase_context functionですか? functionエレガンスのためだけでなく、 内にさらにselectステートメントがあるため、 を 1 回だけ呼び出したいので、 nfunction呼び出すと効率が低下します。

私が求めているのは、Oracle SQLで次のようなことが達成できるかどうか、つまり、ユーザー定義型インスタンスを行に効果的にフラット化できるかどうかということだと思います:

select PHRASE_CONTEXT(?, ?, ?, ?, ?).* from dual; 

助けてくれて本当にありがとうございます。

4

1 に答える 1

1

このサブクエリファクタリングはそれを行います:

with data as (select phrase_context (?, ?, ?, ?, ?) obj from dual)
select distinct(col)
    from my_view v, data d
    where v.parent_id = d.obj.parent_id
          and 
          v.context = d.obj.context 
于 2012-06-13T16:06:00.130 に答える