Oracle 交叉应用提供缺少的关键字错误
下面的查询给出了缺少的关键字错误Oracle 交叉应用提供缺少的关键字错误,oracle,plsql,cross-apply,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_fnGetAccountId
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;
我不知道我哪里做错了。我对这真的很陌生
APPLY
SQL语法,无论是CROSS-APPLY
还是OUTER-APPLY
,都是在年引入的
Oracle 12c版本。Oracle RDBMS的早期版本不支持APPLY
SQL语法table()
函数:交叉应用
select *
from its_account aac
cross apply TABLE(fnGetAccountIdentifier(aac.account_key)) ;
对于9i及以上的车辆,请使用交叉连接
select *
from its_account aac
cross join TABLE(fnGetAccountIdentifier(aac.account_key)) ;
在您的情况下没有区别-使用交叉连接
将获得与使用交叉应用
相同的结果
select *
from its_account aac
cross apply TABLE(fnGetAccountIdentifier(aac.account_key)) ;
APPLY
SQL语法,无论是CROSS-APPLY
还是OUTER-APPLY
,都是在年引入的
Oracle 12c版本。Oracle RDBMS的早期版本不支持APPLY
SQL语法
选择表格函数时,需要使用table()
函数:
话虽如此,您可以将查询重写如下:
对于12c,使用交叉应用
select *
from its_account aac
cross apply TABLE(fnGetAccountIdentifier(aac.account_key)) ;
对于9i及以上的车辆,请使用交叉连接
select *
from its_account aac
cross join TABLE(fnGetAccountIdentifier(aac.account_key)) ;
在您的情况下没有区别-使用交叉连接
将获得与使用交叉应用
相同的结果,我不确定您是否想要交叉连接,因为我认为您希望表有效地连接到基于account\u键的流水线函数的结果
。但这也是假设两个表中都存在列。这有点不清楚,尤其是因为您没有使用传递给函数的account\u键
select *
from its_account aac
cross apply TABLE(fnGetAccountIdentifier(aac.account_key)) ;
因此,我认为您需要一个普通的内部联接,使用table
操作符将流水线函数结果视为一个表:
select *
from its_account aac
JOIN table(fnGetAccountIdentifier(aac.account_key)) t
ON t.account_key = aac.account_key ;
但是有很多猜测。这里是;交叉连接输出看起来没有什么用处,但只有您才能真正知道这一点,因为我已经编造了数据。我不确定您是否想要交叉连接,因为我认为您希望表能够有效地连接到基于帐户\u键的管道函数的结果。但这也是假设两个表中都存在列。这有点不清楚,尤其是因为您没有使用传递给函数的account\u键
因此,我认为您需要一个普通的内部联接,使用table
操作符将流水线函数结果视为一个表:
select *
from its_account aac
JOIN table(fnGetAccountIdentifier(aac.account_key)) t
ON t.account_key = aac.account_key ;
但是有很多猜测。这里是;交叉连接输出看起来没有什么用处,但只有您才能真正知道这一点,因为我已经编造了数据。我想您可能是指,但这似乎不正确。Oracle没有APPLY
。假设tt\uu fngeaccountidentifier
有一个account\u键
字段,为什么不用普通的内部联接将这两个表联接在一起呢?如果您确实需要可以在键上连接到表(its.fngeaccountidentifier)
的函数-您没有使用当前传入的键值?我想您可能是这个意思,但这似乎不正确。Oracle没有APPLY
。假设tt\uu fngeaccountidentifier
有一个account\u键
字段,为什么不用普通的内部联接将这两个表联接在一起呢?如果您确实需要可以在键上连接到表(its.fngeaccountidentifier)
的函数-您现在没有使用传递的键值吗?