1

ドナーIDが入力されると、ステータスフィールドに基づいてアクティブな誓約をチェックする短い手順を作成しました(データタイプ10のNUMBERはアクティブ、20は完了)、毎月の支払いを行い、すべての条件が満たされた場合はブール値Trueを返しますそうでない場合は False。DBMS 出力を追加する前は正常にコンパイルされますが、エラー PLS-00306:wrong number or types of arguments in call" が発生します。

これを自分で解決するのはかなり気分が良かったのですが、どこが間違っているのかわかりません。また、例外ハンドラに関する説明 (コードでコメント) を探しています。コメントと指導点を事前にありがとうございます!

私のコード:

CREATE OR REPLACE PROCEDURE DDPAY_SP
     (donor_id IN NUMBER, active_pl OUT BOOLEAN)

IS
      pay_count NUMBER;
BEGIN
      SELECT COUNT(*)
         INTO pay_count
         FROM dd_pledge 
         WHERE iddonor = donor_id AND
               idstatus = 10 AND
               paymonths > 1;

      IF pay_count > 1 THEN
         active_pl := TRUE;
      ELSE active_pl := FALSE;
      END IF;
      DBMS_OUTPUT.PUT_LINE('Active Pledge and paymonths: ' || active_pl);

      /* want to add exception but don't understand how to choose
      the handler for blocks of code that are not the Oracle defined
      exceptions--Can someone explain better than book I have? I know    
      code should be:

      EXCEPTION
      WHEN .....
      DBMS_OUTPUT.PUT_LINE('    ');  */

      END;
4

1 に答える 1

4

DBMS_OUTPUT.PUT_LINE('有効な誓約と支払月: ' || active_pl);

BOOLEANDBMS_OUTPUTに渡すことはできません。文字列引数、つまりVARCHAR2データ型のみを渡すことができました。

これが、次のエラーが発生する理由です。

PLS-00306:wrong number or types of arguments in call"

理想的には、 OUTDBMS_OUTPUTパラメータを使用しているため、クライアントに何も送信したくないでしょう。それで十分です。

本当にブール値を出力したい場合は、それを VARCHAR2 データ型に変換する必要があります。

例えば、

SQL> set serveroutput on
SQL> DECLARE
  2    var_bool BOOLEAN;
  3  BEGIN
  4    var_bool := TRUE;
  5    dbms_output.put_line('Status = '||
  6    CASE
  7    WHEN var_bool THEN
  8      'TRUE'
  9    ELSE
 10      'FALSE'
 11    END);
 12  END;
 13  /
Status = TRUE

PL/SQL procedure successfully completed.

SQL>
于 2015-07-01T10:42:24.040 に答える