Oracle:PLS-00103在有条件的过程中发生

时间:2015-10-22 03:58:22

标签: oracle if-statement stored-procedures plsql oracle11g

当我尝试编译此程序时:

PROCEDURE GET_NUMBER_PROPOSED_TRADES(p_client_id NUMBER, p_curr_id NUMBER, p_cursor  OUT sys_refcursor)
IS
BEGIN  
  OPEN p_cursor FOR
      IF (p_client_id = 0 AND p_curr_id = 0)
      THEN
        SELECT COUNT (DISTINCT NVL(id,0)) AS "Proposed_Trade_Number"  FROM proposed_trade;
      ELSE
        SELECT COUNT (DISTINCT NVL(id,0)) AS "Proposed_Trade_Number"  FROM proposed_trade WHERE client_id = p_client_id AND ccy_id = p_curr_id;
      END IF;
END GET_NUMBER_PROPOSED_TRADES;

发生此错误:

  

错误(9,11):PLS-00103:当遇到以下情况之一时遇到符号“IF”:( - + case mod new not null select with continue avg count current exists last min before sql stddev sum variance execute forall合并时间时间间隔日期管道      

错误(18,1):PLS-00103:遇到以下其中一项时遇到符号“PROCEDURE”:end not pragma final instantiable order overriding static member constructor map“static”符号被替换为“程序”继续下去。

     

错误(25,1):PLS-00103:遇到以下其中一项时遇到符号“PROCEDURE”:end not pragma final可实例化的顺序覆盖静态成员构造函数映射符号“static”替换为“PROCEDURE”继续。

但问题是,如果我只是删除IF条件,我可以轻松编译它,所以这对我来说是个新的

1 个答案:

答案 0 :(得分:2)

您无法在游标声明中嵌套if条件,它只是无效的语法。解决这个问题的一种方法是使用单个查询,并使用where子句条件来获得您尝试从if得到的相同逻辑:

OPEN p_cursor FOR
    SELECT COUNT (DISTINCT NVL(id,0)) AS "Proposed_Trade_Number"  
    FROM   proposed_trade 
    WHERE  (p_client_id = 0 AND p_curr_id = 0) OR 
           (client_id = p_client_id AND ccy_id = p_curr_id);