游标声明与order by子句抛出错误

时间:2018-02-23 12:36:26

标签: plsql oracle11g cursor

下面的游标声明有什么问题,我收到错误

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;

2 个答案:

答案 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应使用表名限定。
  • 如果您的代码不需要游标,那么您应该只使用查询来进行处理。