e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第31回 「パッケージの利用例 定数の宣言」

2012.08.06

パッケージの利用例として、定数の宣言をあげることができます。

定数はある特定の値を表す変数のようなものです。
ただし変数と違って値を代入することはできません。
つまり値の変更ができない変数と考えるとよいでしょう。

ある特定の値をプログラム中に記述せずに、定数を使うことでどんな利点があるのでしょうか?

例えば、消費税率は現在、5%ですが、近い将来変更になる可能性があります。
そのような時に「5」という数字を税額計算のロジックに直接記述せずに、定数として宣言して、その定数を使うように記述しておきます。
そうしておけば、実際に消費税率が変更になったとき、消費税率の定数の宣言だけを修正しておけば、税額計算のロジックについては修正は不要ですので、プログラムのメンテナンスがしやすくなります。

SQL> CREATE OR REPLACE FUNCTION FUNC_税額 ( P_KINGAKU IN NUMBER )
  2  RETURN NUMBER
  3  IS
  4      RITU CONSTANT NUMBER := 5; --ローカルな宣言部で定数を宣言
  5  BEGIN
  6      RETURN ( P_KINGAKU * ( 1 + RITU/100));
  7  END;
  8  /

ファンクションが作成されました。

SQL> SELECT FUNC_税額(1000) FROM DUAL;

FUNC_税額(1000)
---------------
           1050

上記のファンクションは、ローカルな宣言部(4行目)で、5という値の定数を宣言して、6行目で呼び出し元から渡された値を税額計算して課税後の金額でリターンするものです。
その下の実行例で、1000という値に対して、1050の値を返していることがわかります。

これはこれで、文法的には正しい記述ではあるのですが、この定数がローカルな宣言部(ファンクションのISからBEGINまでの間)で宣言されていることが問題です。
ローカルな宣言はそのプログラムの中でのみ有効です。
もしこのように、消費税率の定数を各プログラムのローカルな宣言部で宣言しているのなら、消費税率が変更になった場合に、各プログラムのその宣言をすべて修正しなければいけません。
それではいかにも不都合ですね。

そこでこのような場合にパッケージにその定数の宣言を行います。
そうすればパッケージでその定数が宣言済みですから、各プログラムはその定数を宣言せずに直接使用することができます。

以下の例をご覧ください。

<<定数を宣言したパッケージ仕様部の作成>>
SQL> CREATE OR REPLACE PACKAGE PAC1 IS
  2     RITU CONSTANT NUMBER := 5; --PAC1パッケージに定数RITUを宣言
  3  END;
  4  /

パッケージが作成されました。

<<先のファンクションをそのパッケージ定数を使った形に修正>>
SQL> CREATE OR REPLACE FUNCTION FUNC_税額 ( P_KINGAKU IN NUMBER )
  2 RETURN NUMBER
  3  IS          -- ローカルな宣言部では宣言しない
  4  BEGIN
  5    RETURN ( P_KINGAKU * ( 1 + PAC1.RITU/100)); --パッケージ定数を使って計算
  6  END;
  7  /

ファンクションが作成されました。

<<そのファンクションがきちんと動作することの検証>>
SQL> SELECT FUNC_税額(2000) FROM DUAL;

FUNC_税額(2000)
---------------
           2100

このように、消費税率など、将来変更になるかもしれない値はパッケージを使って定数化しておけば、将来、消費税率が変更されてもパッケージの定数宣言を1箇所修正するだけで済み、それを参照する各プログラムには一切の修正はありませんので、メンテナンスが大変簡単になります。

これはパッケージのよくある用途です。
例として覚えておくとよいでしょう。

ではまた次回にご期待ください!

先頭へ戻る