9

Oracleでパッケージを定義すると、ヘッダーとボディのようなものがあります。

両方の場所ですべてのパラメータを定義する必要があります。呼び出し側プログラム(IBMメッセージ・ブローカー)のパラメーターの1つをオプションにしたい。ヘッダーと本文の両方の定義にデフォルト値を追加する必要がありますか?

さらに、messagebrokerがデフォルトでパラメータの値を指定せずにprocを呼び出すことができることを誰かが確認できますか?

ありがとう!

更新:デフォルトを本文ではなくヘッダーに追加できるか、両方に追加できることに気付きました。体だけに入れることはできません。

両方に追加することとヘッダーだけに追加することの違いは何ですか?

アップデート:

これは、本体ではなく仕様でデフォルトのみを指定する場合に実行できます。または、両方の場所でデフォルトを指定することもできます。違いは何ですか?

create or replace
package myPackage is
PROCEDURE myProc  (
    parm1 IN varchar2,                           
    parm1 IN date,                     
    parm1 IN number default null
);
end myPackage;

create or replace
package body myPackage is
PROCEDURE myProc  (
    parm1 IN varchar2,                           
    parm1 IN date,                     
    parm1 IN number
) is
...
...
...
end myProc;
end myPackage;
4

2 に答える 2

12

パラメータをオプションにする場合は、デフォルトを指定する必要があります。本体の宣言に無ければデフォルト値がちゃんと動くとは驚きです。

問題を回避するために、すべてのパッケージ仕様宣言をパッケージ本体宣言の正確なコピーにする習慣を身につけました。

編集:

OPが指摘しているように、それは仕様にのみ含まれている可能性があり、機能します。本体にあるが仕様にない場合、エラーが発生します。

SQL> CREATE OR REPLACE PACKAGE p AS
  2  PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2);
  3  END;
  4  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
  2  PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1', p2 VARCHAR2)
  3  IS
  4  BEGIN
  5    dbms_output.put_line(p1||','||p2);
  6  END;
  7  END;
  8  /

Warning: Package body created with compilation errors
SQL>

ただし、仕様のみの場合、すべてが機能します。

SQL> CREATE OR REPLACE PACKAGE p AS
  2  PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1Dflt', p2 VARCHAR2);
  3  END;
  4  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
  2  PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2)
  3  IS
  4  BEGIN
  5    dbms_output.put_line(p1||','||p2);
  6  END;
  7  END;
  8  /

Package body created
SQL> DECLARE
  2  BEGIN
  3    p.prc(p2=>'Test');
  4  END;
  5  /

P1Dflt,Test

PL/SQL procedure successfully completed

SQL> 

そうは言っても、違いは何かという質問への答えは、デフォルトを仕様のみに配置することと両方の場所に配置することに違いはないようです-最終結果は同じです。ドキュメンタリーの目的で両方の場所に配置する必要があるという私の信念を繰り返します.

于 2011-08-31T18:53:51.650 に答える
1

パッケージでは、仕様または本体のいずれかにデフォルトの変数/定数を含めることができます。個人的には、何が起こっているのかを理解するために仕様を見る必要がないので、それらを本体に入れました。公式オラクルが私に反対していることは知っています。本体では、これはまっすぐ下に来るはずですcreate or replace

単語パラメーターの使用に少し混乱していますが、これはパッケージ内の関数/プロシージャにこれを渡していることを意味します。パッケージの仕様または本体にグローバル変数が設定されている場合、それをどこにでも渡す必要はまったくありません。グローバルを変更している場合は、混乱の山全体を求めているか、数年後にあなたをフォローしている人にギフトを贈ります.

1 つの関数/プロシージャのみに使用している場合は、宣言でその特定の要素に設定します。

これは役立つはずです。

于 2011-08-31T20:15:08.553 に答える