• 締切済み

PL/SQL パッケージでのプロンプト使用

こんにちは。 独学でPL/SQLを学んでいるのですが、パッケージの使用でうまく処理が走らないので、 アドバイスを頂けたらと思い書き込みさせて頂くことにしました。 パッケージtestは、オーバーロードプロシージャSHOW_BIZDAYS(日付, 数値)とSHOW_BIZDAYS(日付)を含んでいます。パッケージコードは質問の下に書いております。 ■質問1 オーバーロードプロシージャSHOW_BIZDAYSの日付のみパラメータとする2つ目のプロシージャを EXECUTE test.SHOW_BIZDAYS('20-NOV-13') コマンドで実行したところ、『PLS-00307: このコールに一致する'string'が複数宣言されています。』というエラーが表示されてしまいます。 2つのオーバーロードプロシージャのパラメータ数が異なるよう指定しているので、このエラーに関する原因を見つけれておりません。 ■質問2: SHOW_BIZDAYS(日付)において、ユーザーに数値を入力するようプロンプトをしたいのですが、 PROCEDURE SHOW_BIZDAYS( v_start_date IN DATE := sysdate) IS ACCEPT tdays PROMPT 'Enter how many days are needed: ' v_bus_days NUMBER := &tdays; と記載するとACCEPT文が無効とのエラーが検出されます。パッケージ内ではACCEPTが使用できないということでしょうか。 ■パッケージ create or replace PACKAGE test IS PROCEDURE SHOW_BIZDAYS( v_start_date IN DATE := sysdate, v_bus_days IN NUMBER := 30); PROCEDURE SHOW_BIZDAYS( v_start_date IN DATE := sysdate); END test; ■パッケージ本体 create or replace PACKAGE BODY test IS PROCEDURE SHOW_BIZDAYS( v_start_date IN DATE := sysdate, v_bus_days IN NUMBER := 30) IS v_counter NUMBER(3) := 1; v_date DATE := v_start_date; BEGIN WHILE v_counter <= v_bus_days LOOP IF UPPER(TO_CHAR(v_date, 'D')) NOT IN (1, 7) THEN DBMS_OUTPUT.PUT_LINE('The index is : ' || v_counter || ' and the table value is: ' || v_date); v_counter := v_counter + 1; END IF; v_date := v_date + 1; END LOOP; END SHOW_BIZDAYS; PROCEDURE SHOW_BIZDAYS( v_start_date IN DATE := sysdate) IS ACCEPT tdays PROMPT 'Enter how many days are needed : '; v_bus_days NUMBER := &tdays; v_counter NUMBER(3) := 1; v_date DATE := v_start_date; BEGIN WHILE v_counter <= v_bus_days LOOP IF UPPER(TO_CHAR(v_date, 'D')) NOT IN (1, 7) THEN DBMS_OUTPUT.PUT_LINE('The index is : ' || v_counter || ' and the table value is: ' || v_date); v_counter := v_counter + 1; END IF; v_date := v_date + 1; END LOOP; END SHOW_BIZDAYS; END test; 初歩的な質問で申し訳ありませんが、下記につきアドバイスをお願いします。

みんなの回答

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

質問1について。 >2つのオーバーロードプロシージャのパラメータ数が異なるよう指定しているので、このエラーに関する原因を見つけれておりません。 とありますが、 >PROCEDURE SHOW_BIZDAYS( >v_start_date IN DATE := sysdate, >v_bus_days IN NUMBER := 30); と、v_bus_daysのデフォルト値を設定しているため、 >EXECUTE test.SHOW_BIZDAYS('20-NOV-13') この呼び出しは、EXECUTE test.SHOW_BIZDAYS('20-NOV-13', 30); と同じことになります。 ですので、デフォルト値の設定を消さなければいけません。

maple0823
質問者

補足

yamada_gさん 回答ありがとうございます。 この問題のインストラクションに『パラメータはそれぞれシステム日付と30をデフォルト値として設定すること』と 記載されているので、デフォルト値の設定を消す以外の解決策はないでしょうか?

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 先ず、オーバーロードの件はパラメータをDATE 型に変換 していない事が原因です。 EXECUTE test.SHOW_BIZDAYS(TO_DATE('20-NOV-13', 'DD-MON-YY')) としてみて下さい。 次に、プロンプトの件ですがACCEPT はSQL*Plus のコマンドなので PL/SQL から使用する事はできません。 PL/SQL のパッケージにも、そのような機能は無いようですので SQL*Plus で処理させる事になると思います。

maple0823
質問者

補足

muyoshidさん 回答ありがとうございます。 1つ目のプロシージャをEXECUTE Lab5.SHOW_BIZDAYS('20-NOV-11', 30)で呼び出す際、 エラーが発生せず正常に処理されます。アドバイス頂いた通りTO_CHARを使用してみましたが、 結果は変わりませんでした。。 ACCEPTはEXECUTEの直前で処理するよう試してみようと思います。