包体中的全局变量如何为多个用户工作

时间:2017-01-27 05:30:46

标签: oracle oracle11g


我编写了一个程序,其中SQL查询&查询ID保存在表格中。用户将选择查询ID,程序将生成其输出到指定的UNIX目录。

现在我在从表中获取查询后,将查询保存在包体的全局变量中
我担心的是,当多个用户同时运行程序时,我的全局变量(存储SQL查询)会相应更新吗?

例如:

    create or replace package test
    is
    global_sql varchar2(40000);

       procedure get_sql(p_sql_id number)
        is 
       begin

         select sql into global_sql from query_table where sql_id = p_sql_id;
         //more code     
       end;

    end;

现在,当多个用户同时为不同的sql_id运行此程序时,我的global_sql会因此对所有用户有所不同吗?

1 个答案:

答案 0 :(得分:3)

我想你的意思是包变量? 在这种情况下,任何不同连接中的任何用户都将在他自己的变量副本中获得自己的值。所有这些值将保留在UGA(用户全局区域)中。

例如,我创建没有body的包来保存一个变量:

connect test/test

create or replace package test_var is 
   v_sql_text varchar2(4000); 
end test_var;
/

exec test_var.v_sql_text := 'FIRST_QUERY:select * from dual'; 

打开另一个会话

connect test/test
set serveroutput on 

exec dbms_output.put_line( test_var.v_sql_text); 

/*result is empty*/

exec test_var.v_sql_text := 'TEXT_QUERY:select * from all_tables'; 

exec dbms_output.put_line( test_var.v_sql_text); 

-- 
TEXT_QUERY:select * from all_tables

返回第一个会话

exec dbms_output.put_line( test_var.v_sql_text); 

-- 
FIRST_QUERY:select * from dual