带有 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 转换为 datesysdate 已经是一个日期,所以合适的函数是 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;