PL/SQL - 全局变量并非在所有会话中都可用

Posted

技术标签:

【中文标题】PL/SQL - 全局变量并非在所有会话中都可用【英文标题】:PL/SQL - global variable isn't avaible in all Sessions 【发布时间】:2014-11-13 13:20:30 【问题描述】:

我有一个关于在 PL/SQL 包中使用全局变量的理解问题。 我在包的规范中声明了一个全局变量。

--> g_processid VARCHAR2 (30);

在同一个包的主体中,我在首先使用的过程中初始化变量 在我的过程中。这很好用。变量的结果不为空。

之后,主会话开始另一个过程 16 次。所以我有 16 个并行作业做同样的事情。

片段:


FOR i IN 1 .. p_process_count
      LOOP
         DBMS_JOB.submit (job            => v_job_sid,
                            what           =>    p_jobname
                                              || '('
                                              || i
                                              || ','
                                              || p_process_count
                                              || ');',
                          next_date      => SYSDATE,
                          no_parse       => FALSE
                         );
        ....
         v_job_counter := v_job_counter + 1;
         v_tab_kuba_jobs (v_job_counter) := v_job_sid;
         COMMIT;
         IF  p_process_count > 0
         AND i = 1 THEN
             -- 60 Sekunden Pause
             DBMS_LOCK.sleep (180);
         END IF;
      END LOOP;

在线程使用的过程中,我想使用我的全局变量。 我以这种方式调用变量: . 我的问题是 Thread 中的变量是空的。

也许是因为这些进程没有使用我的包的同一个实例。 我必须做些什么才能使我的变量可用于我的所有会话。

感谢您的推荐。我appriciate任何形式的建议。

最好的问候 约恩

【问题讨论】:

您可以将变量存储在表中,并创建一个返回该值的函数。这不是一个有效的解决方案,但它可能有助于解决您的问题 【参考方案1】:

您可以使用全局应用程序上下文的概念在会话之间共享数据

https://docs.oracle.com/cd/E25054_01/network.1111/e16543/app_context.htm#CIHFJHCG

这里有一个很好的例子http://technology.amis.nl/2009/01/21/oracle-database-cross-session-data-cache-introducing-the-globally-accessible-database-context

基本上你使用

1) create or replace context global_cache using cache_mgr ACCESSED globally;

2) 编写一个包含使用DBMS_SESSION.SET_CONTEXT( 'global_cache','my_key' , 'my shared value');的过程的包

3) 使用打包过程设置值

4) 使用sys_context('global_cache','my_key') 检索其他会话中的值

【讨论】:

【参考方案2】:

感谢您的回答。是的,不管是否是全局变量,不可能以正常方式访问另一个进程的变量,因为每个进程都使用自己的内存等。

实际上我通过将数据存储在表中解决了这个问题。每个进程都必须自己初始化值。全局应用上下文听起来很有趣。 谢谢。

发布我的问题后,我发现了这个很好的解释:

包实例化和初始化

当会话引用包项时,Oracle 数据库会为该会话实例化包。每个引用包的会话都有自己的该包的实例化。

当 Oracle 数据库实例化一个包时,它会对其进行初始化。初始化包括以下任何一项适用:

为公共常量分配初始值 为声明指定的公共变量分配初始值 执行包体的初始化部分

【讨论】:

以上是关于PL/SQL - 全局变量并非在所有会话中都可用的主要内容,如果未能解决你的问题,请参考以下文章

PHP 全局变量 - 超全局变量

在 Oracle PL/SQL 中重用绑定变量

Oracle 终止会话过程

PHP 超全局变量之$GLOBALS

Oracle PL/SQL 动态 if 语句全局变量

将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定