带有 order by 子句抛出错误的游标声明
cursor declaration with order by clause throwing error
下面的游标声明有什么问题,我收到错误
Error(4,6): PL/SQL: SQL Statement ignored
Error(10,3): PL/SQL: ORA-00907: missing right parenthesis.
当我删除 order by 子句并尝试不抛出错误时。但是对于 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;
您的具体问题是 table 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()
是将 string 转换为 date。 sysdate
已经是一个日期,所以合适的函数是 trunc()
.
METHOD
应使用 table 名称进行限定。
- 如果您的代码不需要游标,那么您应该只使用查询来进行处理。
不需要在光标后加上(
。试试这个:
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;
下面的游标声明有什么问题,我收到错误
Error(4,6): PL/SQL: SQL Statement ignored Error(10,3): PL/SQL: ORA-00907: missing right parenthesis.
当我删除 order by 子句并尝试不抛出错误时。但是对于 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;
您的具体问题是 table 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()
是将 string 转换为 date。sysdate
已经是一个日期,所以合适的函数是trunc()
.METHOD
应使用 table 名称进行限定。- 如果您的代码不需要游标,那么您应该只使用查询来进行处理。
不需要在光标后加上(
。试试这个:
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;