【问题标题】:seq.nextval as global variable Oracleseq.nextval 作为全局变量 Oracle
【发布时间】:2021-12-18 00:21:01
【问题描述】:

我的包 pr_1、pr_2、pr_3 中有三个程序。无论执行顺序,我都想在所有程序中使用相同编号的序列。

我怎样才能做到这一点? 当我尝试将其设置为头部规范中的全局变量时:

next_seq_val CONSTANT NUMBER := SEQ.NEXTVAL

我得到了所需的结果:

next_seq_val in pr_1: 22 
next_seq_val in pr_2: 22 
next_seq_val is pr_3: 22

但我再次用同样的程序执行包后,还是得到了同样的结果:

next_seq_val in pr_1: 22 
next_seq_val in pr_2: 22 
next_seq_val is pr_3: 22

应该是 23 岁。

我也试过用easy函数:

 FUNCTION GetSeqValue
      RETURN NUMBER
      IS
    BEGIN
          RETURN your_sequence.NEXTVAL;
    END;

并将其放入程序中,但结果当然是:

next_seq_val in pr_1: 22 
next_seq_val in pr_2: 23 
next_seq_val is pr_3: 24

我只需要所有程序的相同编号,但我不能将其作为参数,因为我不知道程序将按什么顺序执行,而且似乎可以为此放置全局变量。感谢您的建议。

【问题讨论】:

  • 不要让它成为常数
  • 您是想让它在所有会话中“全局化”,还是仅在一个会话中?如果您想再次调用这组程序怎么办(在同一个会话或另一个会话中 - 取决于先前的问题);你怎么知道它是一个新集合,还是前一个集合中的乱序调用?
  • 我想在一个会话中使其全局化,我知道在 pkg 的头部声明它可能不是一个好主意,因为它将用一个数字编译,而不是在执行时保持静态。我只是假设这是一个应该存在的地方,以便所有程序都可以处理相同的变量。

标签: sql oracle plsql sequence


【解决方案1】:

您使用Package 走在正确的道路上,只是不要将值放在标题中。在包中创建访问进程并在主体中定义 global 变量,但不在任何过程/函数中。 (见demo

create or replace package seq_val_pkg is
    procedure set_val;     
    function  next_val return integer;
end seq_val_pkg;   

create or replace package body seq_val_pkg is
    g_seq_val integer := null; 
    
    procedure set_val is
    begin
       g_seq_val := your_sequence.nextval; 
    end set_val ; 
     
    function next_val return integer is
    begin          
        return g_seq_val;
    end next_val;
begin
   -- Pacakge initialization code. This runs once when the pacakge is loaded.
   set_val; 
end seq_val_pkg; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多