2017-11-25 103 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。

相關問題