oracle 包中定义全局变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 包中定义全局变量相关的知识,希望对你有一定的参考价值。

我有个问题就是如何在包中存储全局变量然后得出它的值,我的需求是这样的就是以下函数中在条件type=1的条件下得出多个quantity,如何累加这些quantity得到他们的总和?还有就是包中还有个存储过程,存储过程调用这个函数。请大家帮忙想下
假设包中有一个函数
function fun_test(para number,type number)return varchar2
is
quantity
begin
if type = 1
then
selete sum(1) into quantity from table
where 条件;
return quantity
end if;
end;
可能我描述的不是很清楚,3楼的朋友没有理解我的意图,要是简单的V1:=V2就好了。是这样的在if type = 1
条件里边要进来几次的,所以得出的quantity是几个数值,我要把这几个数值累加起来 .请问2楼的朋友游标怎么个累加呢?譬如:cursor cur_fac is select 字段 from table ,然后呢?

这得用游标了,每次得出来后相加就行了,或者你说的是||,自己找下关于游标的例子吧 .
function fun_test(para number,type number)return varchar2
is
--客户名称游标
cursor cur_fac is select 字段 from table where xx;
quantity
temp1
temp2

begin

--打开客户名称游标,逐一对每个客户进行数据统计
open cur_fac
loop
fetch cur_fac into temp1;
exit when cur_fac r%NOTFOUND;

selete xx into temp2 from table
where temp1=xx;
quantity := quantity + temp2;

end loop;
close cust_name_cursor;

return quantity ;
exception
null;

end
参考技术A --package
create or replace package p_name as
function f_name(v1 in out number) return number;
procedure p_name(v1 in out number);
end p_name;
--package body
create or replace package body p_name is
function f_name(v1 in out number) return number is
v2 number;
begin
return v2;
end;
--function
create or replace function f_name(v1 in out number) return number is
v2 number;
begin
v2 := v1; return v2;
end;
几种写法都给你 你自己参考了写吧。。。
参考技术B function fun_test(para number,type number)return varchar2
is
quantity number(15,2):=0;
temp number(15,2):=0;
begin
if type = 1
then
selete sum(1) into temp from table
where 条件;
quantity:=quantity+temp;
dbms_output.put_line(temp);
return quantity
end if;

end;

如何在 Oracle 的 PL/SQL 中定义全局变量?

【中文标题】如何在 Oracle 的 PL/SQL 中定义全局变量?【英文标题】:How to define global variable in PL/SQL in Oracle? 【发布时间】:2015-03-31 06:50:01 【问题描述】:

如何在 PL/SQL 中定义一个可用于所有函数/过程/包的全局变量?

可以定义吗?

或者有没有其他方法可以做到这一点?

【问题讨论】:

您希望这个全局变量的值在所有会话之间共享还是对每个会话都是私有的? 我记得有一种方法可以将包状态变量存储在 SGA 或 UGA 中? (不在 PGA 中),然后在会话之间共享包状态。但我无法在文档中对此进行任何参考。 【参考方案1】:

使用包规范中的变量创建新包,如下所示:

CREATE PACKAGE my_public_package IS
  my_var Number;
END;

现在您可以通过访问 my_public_package 访问任何代码中的变量

...
my_public_package.my_var := 10;
...

【讨论】:

这种方式可以使用pl/sql关联数组来实现全局哈希表 这个变量是会话范围的 OP 要求一个 GLOBAL 方法,如果一个 s @PavelGatnar 说这是本地/会话,那么这不是一个有效的答案(我需要知道同样的,特别是如何设置全局)【参考方案2】:

如何在 PL/SQL 中定义一个可用于所有函数/过程/包的全局变量?

您可以使用Global Application Context variable。

应用程序上下文是一组名称-值对,Oracle 数据库存储在内存中。应用程序上下文有一个名为的标签 命名空间,例如,用于应用程序上下文的 empno_ctx 检索员工 ID。上下文内部是名称-值对 (关联数组):名称指向内存中的一个位置 持有价值。应用程序可以使用应用程序上下文来 访问有关用户的会话信息,例如用户 ID 或其他 特定于用户的信息或客户端 ID,然后安全地传递 数据到数据库。然后,您可以使用此信息 允许或阻止用户通过 应用。您可以使用应用程序上下文对两者进行身份验证 数据库和非数据库用户。

如果您希望任何 PL/SQL 对象访问该变量的所有会话中的 variable 值都应相同,则使用数据库表来存储价值。

例如,正如 T.Kyte 建议的 here

CREATE TABLE global_value(x INT);

INSERT INTO global_value VALUES (0);

COMMIT;

CREATE OR replace PACKAGE get_global
AS
  FUNCTION Val
  RETURN NUMBER;
  PROCEDURE set_val (
    p_x IN NUMBER );
END;

/

CREATE OR replace PACKAGE BODY get_global
AS
  FUNCTION Val
  RETURN NUMBER
  AS
    l_x NUMBER;
  BEGIN
      SELECT x
      INTO   l_x
      FROM   global_value;

      RETURN l_x;
  END;
  PROCEDURE Set_val(p_x IN NUMBER)
  AS
    PRAGMA autonomous_transaction;
  BEGIN
      UPDATE global_value
      SET    x = p_x;

      COMMIT;
  END;
END;

/  

【讨论】:

你应该使表、getter 和 setter 更通用以存储键值对,1 个表对应 1 个值是一种过度杀伤 一个表一个值? 你在哪里看到我说的每个值一个表?它只是一个全局变量值的表。在评论和否决之前了解。你知道这是 Thomas Kyte 提供的解决方案吗? asktom.oracle.com/pls/asktom/… 为什么 AUTONOMOUS_TRANSACTIONSet_val 中? 因为即使其他程序失败,您也希望确保更新发生。因为你想设置上下文。 1.好的,所以你有 1 个变量的 1 列(你的答案中没有提到)。那么就可以了。你应该只调整你的 getter 和 setter 名称......然后我会支持你的答案 2. 如果不是你的想法,你应该参考源代码【参考方案3】:
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value] 

【讨论】:

以上是关于oracle 包中定义全局变量的主要内容,如果未能解决你的问题,请参考以下文章

qml全局变量定义建议

解释啥是全局变量,如何定义

C语言中如何定义全局变量

全局变量怎么定义

fortran 定义全局变量

FORTRAN中如何定义全局变量