2012-05-08 19 views
1

作成した関数のパラメータを 'Where'句のSQL * Plusの 'Select'文に渡すときに問題があります。しかし、私が利用した構文は、この 'Where'節の状況では間違っているか全く使われていないようです。SQL * PlusでFunctionから 'Select' stmtにパラメータ(値)を渡す/コールする方法は?

ここに私が作成した私の関数であり、それがコンパイルされてOKに見えると良い走っ:また

CREATE OR REPLACE FUNCTION SA_BILL_CNTRL_EXTRNL_FXN(p_client_code  VARCHAR2 
                ,p_bill_seq   VARCHAR2 
                ,p_bill_control_seq VARCHAR2) 
    RETURN VARCHAR2 IS 
    v_external_id  VARCHAR2(30); 
    v_client_code  VARCHAR2(4) := p_client_code; 
    v_bill_seq   NUMBER := to_number(p_bill_seq); 
    v_bill_control_seq NUMBER := to_number(p_bill_control_seq); 
    v_cnt    NUMBER; 
BEGIN 
    SELECT COUNT(*) 
    INTO v_cnt 
    FROM [email protected]_SAREP bc 
    WHERE bc."ExternalID" IS NOT NULL 
     AND bc."ExternalID" != '' 
     AND bc."ClientCode" = p_client_code 
     AND bc."BillControlSeq" = v_bill_control_seq 
     AND bc."BillSeq" = v_bill_seq; 
    IF v_cnt = 1 THEN 
    SELECT bc."ExternalID" 
    INTO v_external_id 
    FROM [email protected]_SAREP bc 
    WHERE bc."ExternalID" IS NOT NULL 
      AND bc."ExternalID" != '' 
      AND bc."ClientCode" = p_client_code 
      AND bc."BillControlSeq" = v_bill_control_seq 
      AND bc."BillSeq" = v_bill_seq; 
    ELSE 
    v_external_id := NULL; 
    END IF; 
    RETURN v_external_id; 
END SA_BILL_CNTRL_EXTRNL_FNX; 
/

、私はそれを実行した後に失敗した関数のパラメータ「OUT IN」を使用する場合。私は自分自身を徹底的にperflexed残っていた最後の2日間

SELECT NVL(TRIM(eb.CASE_NUM_REEVALUATED), TRIM(eb.CASE_NUM_DUPLICATED)) CaseNumReev 
     ,gnc.BILL_CONTROL_SEQ 
FROM EPE_Bill eb NETWORK_CROSSWALK gnc 
WHERE substr(eb.MIC_BILL_ID, 5, 4) = SA_BILL_CNTRL_EXTRNL_FNX(p_client_code) 
     AND gnc.BILL_CONTROL_SEQ = SA_BILL_CNTRL_EXTRNL_FNX(p_bill_seq) 
     AND (to_number(substr(eb.MIC_BILL_ID, 10, 10), '9999999999') = SA_BILL_CNTRL_EXTRNL_FNX(p_bill_control_seq) 
GROUP BY CaseNumReev, gnc.BILL_CONTROL_SEQ; 

は今、ここに私は苦労してパラメータを渡すを抱えている「を選択」ステートメントです。 これで、私が問題を手伝ってくれたら本当に感謝しています。

おかげで再び...

+4

あなたの関数は3つのパラメータ(デフォルトはありません)をとりますが、あなたは1だけで呼び出していますが、これは無効です。 –

+0

あなたはどんな具体的なエラーがありますか?また、投稿されたコードに関数名のタイプミスがあります。作成時にはSA_BILL_CNTRL_EXTRNL_FXN、where句にはSA_BILL_CNTRL_EXTRNL_FNXがあります。 – DCookie

+0

また、列別名を 'group by 'することもできません。 who 'nvl'句を繰り返す必要があります(または別の選択肢をラップしてください)。既に発見したように、通常のSQLから 'in out'パラメータを持つ関数を呼び出すことはできません。 –

答えて

1

は、以下の機能を試してみて、また、私はあなただけつのパラメータを渡しているので、残りはNULLでなければならないことを前提に作られた

CREATE OR REPLACE FUNCTION SA_BILL_CNTRL_EXTRNL_FXN(p_client_code IN VARCHAR2 DEFAULT NULL            
               ,p_bill_seq  IN VARCHAR2 DEFAULT NULL 
               ,p_bill_control_seq IN VARCHAR2 DEFAULT NULL) 
RETURN VARCHAR2 IS 
v_external_id  VARCHAR2(4000); 
v_client_code  VARCHAR2(4) := p_client_code; 
v_bill_seq   NUMBER := to_number(p_bill_seq); 
v_bill_control_seq NUMBER := to_number(p_bill_control_seq); 
v_cnt    NUMBER; 
BEGIN 
    SELECT COUNT(*) 
    INTO v_cnt 
    FROM [email protected]_SAREP bc 
    WHERE bc."ExternalID" IS NOT NULL 
    AND bc."ExternalID" != '' 
    AND bc."ClientCode" = NVL(p_client_code,bc."ClientCode") 
    AND bc."BillControlSeq" = NVL(v_bill_control_seq,bc."BillControlSeq") 
    AND bc."BillSeq" = NVL(v_bill_seq,bc."BillSeq"); 
    IF v_cnt = 1 THEN 
     SELECT bc."ExternalID" 
     INTO v_external_id 
     FROM [email protected]_SAREP bc 
     WHERE bc."ExternalID" IS NOT NULL 
     AND bc."ExternalID" != '' 
     AND bc."ClientCode" = NVL(p_client_code,bc."ClientCode") 
     AND bc."BillControlSeq" = NVL(v_bill_control_seq,bc."BillControlSeq") 
     AND bc."BillSeq" = NVL(v_bill_seq,bc."BillSeq"); 
    ELSE 
    v_external_id := NULL; 
    END IF; 
     RETURN v_external_id; 
END SA_BILL_CNTRL_EXTRNL_FNX; 
/

そして、あなたのSQLはする必要があります

SELECT REC.CaseNumReev,REC.BILL_CONTROL_SEQ FROM 
(
SELECT NVL(TRIM(eb.CASE_NUM_REEVALUATED), TRIM(eb.CASE_NUM_DUPLICATED)) CaseNumReev 
    ,gnc.BILL_CONTROL_SEQ AS BILL_CONTROL_SEQ 
FROM EPE_Bill eb ,NETWORK_CROSSWALK gnc 
WHERE substr(eb.MIC_BILL_ID, 5, 4) = SA_BILL_CNTRL_EXTRNL_FNX(p_client_code) 
AND gnc.BILL_CONTROL_SEQ = SA_BILL_CNTRL_EXTRNL_FNX(p_bill_seq) 
AND (to_number(substr(eb.MIC_BILL_ID, 10, 10), '9999999999')  =SA_BILL_CNTRL_EXTRNL_FNX(p_bill_control_seq))rec  
GROUP BY REC.CaseNumReev,REC.BILL_CONTROL_SEQ 
+0

ありがとう...私はすべての関数/ sqlを試してみます – valmont74

+0

修正された関数を正常に再コンパイルしようとしました。 ORA-00904: "P_BILL_CONTROL_SEQ":無効な識別子です。何か案は? – valmont74

+0

where節で 'p_client_code'を一重引用符で囲むようにしました。したがって、ORA-00904エラーは無視してください。 ORA-06502:PL/SQL:数値または値エラー:文字列バッファが小さすぎますORA-06512: "GNXSA.GNX_SA_BILL_CNTRL_EXTRNL_ID"、行28に機能に関するアイデアはありますか?どうもありがとう。 – valmont74

関連する問題