0

我有以下代码,我编写了这些代码来调试一些信息

我想调用 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 变量将为空。

解决此问题的一种简单方法是将 sidcache1 声明为包中的变量。包变量在每个会话中初始化一次,每个会话都有自己独特的变量集。我认为您甚至不需要存储 SID,如果已调用 global.init,则布尔值甚至足以记录。

于 2012-04-19T08:31:26.033 回答