交叉申请提供缺少关键字错误

时间:2013-08-16 09:51:15

标签: oracle plsql cross-apply

以下查询显示缺少关键字错误..

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;

我不知道我在哪里做错了。我真的很陌生。

2 个答案:

答案 0 :(得分:7)

  1. APPLY SQL语法,无论是CROSS APPLY还是OUTER APPLY都是在

    中引入的

    Oracle 12c版。 Oracle RDBMS的早期版本不支持APPLY SQL语法。

  2. 从表格功能中选择时,您需要使用TABLE()功能:
  3. 话虽如此,您可以按如下方式重写查询:

    对于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时相同的结果。

答案 1 :(得分: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 ;

但那里有很多猜测。这是an SQL Fiddle showing the results of that join and a cross join;交叉连接输出看起来不太有用,但只有你真的知道,因为我已经完成了数据。