0

私はいくつかの情報をデバッグするために私が書いた以下のコードを持っています

ユーザーセッションごとに1回だけ呼び出す必要があるGLOBAL.INITを呼び出したい

したがって、PLSQLテーブルを使用して値をキャッシュしました。SIDが異なる場合は、もう一度GLOBAL.INITを呼び出しますが、キャッシュが機能していません。親切に助けてください。

create or replace procedure dbg(message in VARCHAR2) is
  sid1 NUMBER;
  idx  NUMBER;
  Type sidcache is table of NUMBER index by binary_integer;
  sidcache1 sidcache;
  sid2      NUMBER;
begin

    select sid
      into sid1
      FROM v$session se
     where se.audsid = SYS_CONTEXT('userenv', 'sessionid');
    BEGIN
    sid2 := sidcache1(sid1);
  EXCEPTION
    WHEN no_data_found THEN
      sidcache1(sid1) := sid1;
      global.INIT('100', 'SYSTEM');
      dbms_output.put_line(1);
    WHEN OTHERS THEN
    dbms_output.put_line(sqlerrm);
  END;
  WRITE_DEBUG.pr_debug('LD', message);
end dbg;

編集#1:-

マイクの答えを試した後、同じ要件が以下を使用して達成されました

create or replace procedure dbg(message in VARCHAR2) is
sid2      NUMBER;
BEGIN
  sid2 := WRITE_DEBUG.sidcache1(1);
EXCEPTION
  WHEN no_data_found THEN
    WRITE_DEBUG.sidcache1(1) := 1;
    global.INIT('100', 'DEBUG');
  WHEN OTHERS THEN
    dbms_output.put_line(sqlerrm);
END; 
WRITE_DEBUG.pr_debug('LD', message);
end dbg;
4

1 に答える 1

2

デフォルトでは、PL/SQL変数はブロックに入るたびに初期化され、値はコール間で引き継がれません。これは、このプロシージャを呼び出すたびに、sidcache1 変数が null になることを意味します。

これを回避する簡単な方法は、sidcache1 をパッケージ内の変数として宣言することです。パッケージ変数はセッションごとに 1 回初期化され、各セッションは独自の変数セットを持ちます。SID を保存する必要さえないと思います。global.init が呼び出されたかどうかを記録するにはブール値で十分かもしれません。

于 2012-04-19T08:31:26.033 に答える