我尝试在pl sql中编写函数,但它生成一个错误ORA-00900:无效的SQL语句,究竟是什么原因?
问题描述:
我是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;
答
你可以使用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;
/
答
主要有3个失误: 1替换函数的恒等式>>创建或替换功能 2-才开始之后添加此行>>打开cur_cbk_param; 3-在执行部分添加此行(在例外之前)>>>>返回响应; 注意:不需要在括号内使用Response。
首先,您需要从“CREATE OR REPLACE FUNCTION”开始,而不仅仅是“FUNCTION”。其次,在循环访问并获取结果之前,您需要“打开”您的光标。第三,你需要'退出'循环'WHEN cur_cbk_param%NOTFOUND'。第四,像这样的游标循环不会抛出“NO_DATA_FOUND”异常。第五,除非出现异常,否则你的函数不会“返回”一个值。您必须在所有情况下返回一个值。 –
要有效诊断出发生的情况,您必须提供说明以创建表cbk_pro_assing_rule。一些示例数据将会有所帮助。 –
[Oracle错误:ORA-00900:无效SQL语句]的可能重复(https://stackoverflow.com/questions/35946606/oracle-error-ora-00900-invalid-sql-statement) –