1 Reply Latest reply: Jun 19, 2012 6:40 AM by 840100 RSS

    ストアドパッケージに使用する変数のライフサイクルについて

    859671
      お世話になっております。

      stored packageで実装されているシステムを開発中で、
      パッケージ中に、フィルタ配列( 結合配列 )や、状態変数を持ちたいと考えています。
      具体的には、以下のようなコードを考えています。

      ============================================================

      create or replace package body pkg_test
      type t_filter is table of number index by varchar2(6); -- 商品番号によるフィルタ
      obj_item_filter t_filter ;

      is_debug bool ; -- デバッグモード

       function setup() is
      begin
      is_debug := true;
      obj_item_filter('10001') := 1000 ;
      obj_item_filter('10002') := 1100 ;
      obj_item_filter('10003') := 1200 ;
      obj_item_filter('10004') := 1300 ;
      obj_item_filter('10005') := 1400 ;

      end ;

      procedure use_filter is..
      begin
      setup
      -- いろんな処理 ......
      end ;

      procedure use_filter2 is
      begin
      -- フィルタを使用する
      if obj_item_filter('10002') > 1000 then...
      end ;

      end pkg_test;

      ============================================================
      -- 別パッケージからobj_item_filterを使用する

      create or replace package body pkg_use_test
      procedure aaa is begin
      if pkg_test.obj_item_filter.count = 0 then
      pkg_test.setup
      end if;

      if obj_item_filter('10002') > 1000 then...
      -- フィルタを使った処理..
      end if
      end aaa;
      end if;

      ============================================================


      ここで質問なのですが、package.setupにて値をセットした変数はいつまで有効になっているのでしょうか?
      一度setupしてしまえば、同じパッケージの関数 use_filter等から使用した場合、obj_item_filterに値が保持
      されているのは当然なのですが、別パッケージから呼び出した場合などは、
      何時まで保持されているのかわからないです。

      ・このシステムでは1日あたり10個位の単独プロシジャやpackage内のプロシジャが動いて、(パッケージ名は全部別)
       自分のやりたいこととしては、、

      ①pkg_test.setupは一日のバッチ起動前に1回だけ起動して、必要なフィルタ、状態変数をセットする。
      ②10個くらいのバッチはpkg_test.obj_item_filterを使用する。
      ③全部終わったら、obj_item_filterを空にする


      ということをやりたいと考えています。
      更に少し言えば、obj_item_filterが一度生成されてしまえば、oracle動作中はずっと保持されていることが保障されるなら、
      週次で更新される filter,
      月次で更新sなれる filterと定義したいのですが、

      出来るかどうかわかりません。



      ご存知の方は教えてください。
      よろしくお願いします。