1

以下のクエリでは、キーワードの欠落エラーが発生しています..

select * 
  from its_account aac 
 CROSS APPLY its.fnGetAccountIdentifier(aac.account_key) ;

ここに私の機能があります:

create or replace FUNCTION fnGetAccountIdentifier
(
  v_AccountKey IN NUMBER
)
RETURN fnGetAccountIdentifier_pkg.tt_fnGetAccountIdentifier_type PIPELINED
AS
   v_temp SYS_REFCURSOR;
   v_temp_1 TT_FNGETACCOUNTIDENTIFIER%ROWTYPE;

BEGIN
   OPEN v_temp FOR
      SELECT * 
        FROM tt_fnGetAccountIdentifier;

   LOOP
      FETCH v_temp INTO v_temp_1;
      EXIT WHEN v_temp%NOTFOUND;
      PIPE ROW ( v_temp_1 );
   END LOOP;
END;

どこが間違っているのかわかりません。私はこれに本当に慣れていません。

4

2 に答える 2

7
  1. で導入されたかどうかにかかわらず、APPLYSQL 構文CROSS APPLYOUTER APPLY

    オラクル 12c バージョン。APPLY以前のバージョンの Oracle RDBMS は、 SQL 構文をサポートしていません。

  2. テーブル関数から選択するときは、関数を使用する必要がありTABLE()ます:

そうは言っても、次のようにクエリを書き直すことができます。

を使用して12c のcross apply場合。

 select * 
   from its_account aac 
  cross apply TABLE(fnGetAccountIdentifier(aac.account_key)) ;

を使用して9i 以上cross joinの場合。

 select * 
   from its_account aac 
  cross join TABLE(fnGetAccountIdentifier(aac.account_key)) ;

あなたの場合、違いはありません - を使用cross joinした場合と同じ結果が得られますcross apply

于 2013-08-16T10:56:17.743 に答える
1

に基づいてパイプライン化された関数の結果にテーブルが効果的に結合されることを期待していると思うので、クロス結合が必要かどうかはわかりませんaccount_key。ただし、それは列が両方のテーブルに存在することも前提としています。account_key特に、関数に渡している を使用していないため、少し不明確です。

したがって、演算子を使用してパイプライン関数の結果をテーブルとして処理する、通常の内部結合が必要だと思います。table

select * 
  from its_account aac 
 JOIN table(fnGetAccountIdentifier(aac.account_key)) t
 ON t.account_key = aac.account_key ;

しかし、そこには多くの憶測があります。これは、その結合とクロス結合の結果を示す SQL Fiddleです。クロス結合の出力は役に立たないように見えますが、データを作成したので、それを本当に知ることができるのはあなただけです。

于 2013-08-16T11:07:11.900 に答える