2017-11-25 102 views
-1

我是pl sql的新手,我尝试编写一个函数,该函数应该从db读取数据来控制它们并返回一个数字,但它会生成一个错误ORA-00900: invalid SQL statement我尝试在pl sql中编写函数,但它生成一个错误ORA-00900:无效的SQL语句,究竟是什么原因?

FUNCTION get_cbk_values    ( TC_CODE    IN NUMBER, 
             MERCHANT_DOM   IN VARCHAR2, 
             MERCHANT_GROUP  IN VARCHAR2, 
             MCC     IN VARCHAR2, 
             COUNTRY    IN VARCHAR2, 
             RATE     OUT NUMBER, 
             FIX     OUT NUMBER) 
    RETURN NUMBER IS 
Response  NUMBER:=1; 

CURSOR cur_cbk_param IS SELECT CBA_RATE, CBA_FIX 
FROM cbk_prog_assign_rule WHERE 
    CBA_TCO = TC_CODE 
AND CBA_DOM_CODE = MERCHANT_DOM 
AND CBA_BMG_CODE = MERCHANT_GROUP 
AND CBA_MCC_CODE = MCC 
AND CBA_MER_COUN_CODE = COUNTRY; 

BEGIN 
LOOP 
FETCH cur_cbk_param into RATE, FIX; 
END LOOP; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
Response := 0; 
Return(Response); 
END; 
+0

首先,您需要从“CREATE OR REPLACE FUNCTION”开始,而不仅仅是“FUNCTION”。其次,在循环访问并获取结果之前,您需要“打开”您的光标。第三,你需要'退出'循环'WHEN cur_cbk_param%NOTFOUND'。第四,像这样的游标循环不会抛出“NO_DATA_FOUND”异常。第五,除非出现异常,否则你的函数不会“返回”一个值。您必须在所有情况下返回一个值。 –

+0

要有效诊断出发生的情况,您必须提供说明以创建表cbk_pro_assing_rule。一些示例数据将会有所帮助。 –

+0

[Oracle错误:ORA-00900:无效SQL语句]的可能重复(https://stackoverflow.com/questions/35946606/oracle-error-ora-00900-invalid-sql-statement) –

回答

0

你可以使用cursor%ROWCOUNT检查,如果没有记录返回,而不是no_data_found。注意,你必须有一个return语句,无论EXCEPTION。所以,你可以返回1成功,0返回失败。

CREATE OR REPLACE FUNCTION get_cbk_values (
    tc_code   IN NUMBER, 
    merchant_dom  IN VARCHAR2, 
    merchant_group IN VARCHAR2, 
    mcc    IN VARCHAR2, 
    country   IN VARCHAR2, 
    rate    OUT NUMBER, 
    fix    OUT NUMBER 
) RETURN NUMBER IS 

    response NUMBER := 1; 
    CURSOR cur_cbk_param IS SELECT 
     cba_rate, 
     cba_fix 
          FROM 
     cbk_prog_assign_rule 
          WHERE 
     cba_tco = tc_code 
     AND cba_dom_code = merchant_dom 
     AND cba_bmg_code = merchant_group 
     AND cba_mcc_code = mcc 
     AND cba_mer_coun_code = country; 

BEGIN 
    OPEN cur_cbk_param; 
    LOOP 
     FETCH cur_cbk_param INTO rate,fix; 
     EXIT WHEN cur_cbk_param%notfound; 
    END LOOP; 
    IF 
     cur_cbk_param%rowcount = 0 
    THEN 
     response := 0; 
    END IF; 
    RETURN response; 
EXCEPTION 
    WHEN OTHERS THEN 
--Preferably use dbms_utility.format_error_backtrace or SQLERRM to display or log the message somewhere. 
     response := 0; 
     RETURN response; 
END; 
/
0

主要有3个失误: 1替换函数的恒等式>>创建或替换功能 2-才开始之后添加此行>>打开cur_cbk_param; 3-在执行部分添加此行(在例外之前)>>>>返回响应; 注意:不需要在括号内使用Response。

相关问题