1

SQL*Plus 'Select' 文の 'Where' 句に作成した関数からパラメータを渡す際に問題があります。ただし、私が使用した構文は、この「Where」句の状況では正しくないか、まったく使用できないようです。

これが私が作成した私の関数であり、コンパイルされて正常に実行されているように見えます:

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 BillControl@SQL_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 BillControl@SQL_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;
/

また、関数で「IN OUT」パラメーターを使用すると、実行後に失敗しました。

ここで、パラメーターを渡すのに苦労している「Select」ステートメントを次に示します。

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;

最後の 2 日間、私は完全に当​​惑しました。それで、問題を解決していただければ幸いです。

再度、感謝します...

4

1 に答える 1

1

以下の関数を試してみてください。また、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 BillControl@SQL_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 BillControl@SQL_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
于 2012-05-09T16:34:00.550 に答える