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. SQL 语法,APPLY无论是在CROSS APPLYOUTER APPLY

    甲骨文 12c 版本。Oracle RDBMS 的早期版本不支持APPLYSQL 语法。

  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,显示了 join 和 cross join 的结果;交叉连接输出看起来没什么用,但只有你才能真正知道,因为我已经整理了数据。

于 2013-08-16T11:07:11.900 回答