下面的游标声明有什么问题,我收到错误
Error(4,6): PL/SQL: SQL Statement ignored Error(10,3): PL/SQL: ORA-00907: missing right parenthesis.
当我删除order by子句并尝试不抛出错误时。但是通过order by子句它没有得到编译。订单不会为游标工作或丢失任何东西?
CREATE OR REPLACE PROCEDURE TEST
IS
CURSOR c_missing_eve
IS (
SELECT
P.PID,P.DIRECTION,E.EVE_NAME
FROM PAY P,EVE E, PAY_EVE_LINK EL
WHERE E.EVE_ID = EL.EVE_ID
AND EL.PAY_ID = P.PAY_ID
AND P.VALUE_DATE=TO_DATE(SYSDATE-1)
AND METHOD IN ('FT', 'FT-RT')
ORDER BY P.PID);
BEGIN
DBMS_OUTPUT.PUT_LINE('HELLO');
--business loginc
END;
答案 0 :(得分:1)
无需在光标后放置(
。试试这个:
CREATE OR REPLACE PROCEDURE TEST
IS
CURSOR c_missing_eve
IS
SELECT
P.PID,
P.DIRECTION,
E.EVE_NAME
FROM
PAY P,
EVE E,
PAY_EVE_LINK EL
WHERE
E.EVE_ID = EL.EVE_ID
AND EL.PAY_ID = P.PAY_ID
AND P.VALUE_DATE= TO_DATE(SYSDATE-1)
AND METHOD IN ('FT', 'FT-RT')
ORDER BY P.PID ;
BEGIN
DBMS_OUTPUT.PUT_LINE('HELLO');
--business loginc
END;
答案 1 :(得分:0)
您的具体问题是表pay
使用了别名p
,因此无法理解pay
。
你需要:
order by p.pid
在此过程中,您应该学会使用正确的,明确的,标准的JOIN
语法:
SELECT P.PID, P.DIRECTION, E.EVE_NAME
FROM PAY P JOIN
PAY_EVE_LINK EL
ON EL.PAY_ID = P.PAY_ID JOIN
EVE E
ON E.EVE_ID = EL.EVE_ID
WHERE P.VALUE_DATE = TRUNC(SYSDATE-1) AND METHOD IN ('FT', 'FT-RT')
ORDER BY P.PID;
附加说明:
TO_DATE()
是将字符串转换为日期。 sysdate
已经是日期,因此相应的功能是trunc()
。METHOD
应使用表名限定。