2017-11-25 4 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

まず、 'FUNCTION'だけでなく、' CREATE OR REPLACE FUNCTION'で始める必要があります。次に、ループして結果を取得する前にカーソルを開く必要があります。第3に、ループ 'いつcur_cbk_param%NOTFOUND'を'終了 'する必要があります。第4に、このようなカーソルループは 'NO_DATA_FOUND'例外をスローしません。第5に、例外がなければ、関数は値を 'RETURN 'しません。すべての状況で値を返す必要があります。 –

+0

起こっていることを効果的に診断するには、テーブルcbk_pro_assing_ruleを作成するための指示を提供する必要があります。いくつかのデータ例が役立ちます。 –

+0

[Oracle ERROR:ORA-00900:無効なSQL文]の重複している可能性があります(https://stackoverflow.com/questions/35946606/oracle-error-ora-00900-invalid-sql-statement) –

答えて

0

あなたはレコードが代わりにあなたは関係なく、EXCEPTIONのreturn文を持っている必要があります。注no_data_foundで返されていないかどうかを確認するためにcursor%ROWCOUNTを使用することができます。したがって、成功の場合は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- >>のfuctionを交換して作成するか>>オープンcur_cbk_paramを次の行を追加機能 2-ただ、後に開始置き換えます。 3実行セクション(例外の直前)にこの行を追加>>>>返信応答; 注:ブラケットの中にレスポンスを使用する必要はありません。

関連する問題