当我尝试编译此程序时:
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条件,我可以轻松编译它,所以这对我来说是个新的
答案 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);