暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 常量声明的更改值

askTom 2017-03-17
397

问题描述

嗨,

在我的代码中,我通过一个自定义函数定义了一个常量,该函数从数据库中获取一些数据并创建一个自定义类型的实例。如果函数的返回值随时间变化,我想知道哪个事件会触发该常量的刷新。
我希望每天都会发生这样的事情。

这里是常数定义:

tppag_convers CONSTANT SER_REDD.TB_CHAR3 := ser_redd.fetchChar3Config('UMBR_FUND_CAUS_CONVERS');



tnkz


专家解答

如果你想改变某物的价值,那么它 “不是常数”!

无论如何,您可以定义PL/SQL包变量。当您调用包时,数据库为每个会话初始化这些。

例如,您可以创建一个基于SQL语句返回值的函数。将此分配给包级别变量:

create table t (
  x int 
);
insert into t values (1);
commit;

create or replace function f
  return t.x%type as 
  retval t.x%type ;
begin
  select x into retval from t;
  
  return retval;
end;
/

create or replace package pkg as
  v pls_integer := f;
  procedure p;
end pkg;
/

create or replace package body pkg as
  procedure p as
  begin
    dbms_output.put_line('The value of v is: ' || pkg.v);
  end p;
end pkg;
/

set serveroutput on
exec pkg.p;

The value of v is: 1


包变量保留其值,直到会话结束。所以如果函数返回一个新值,你的变量保持不变:

update t set x = 2;
commit;

select f, x from t;

F  X  
2  2  

exec pkg.p;

The value of v is: 1


除了关闭所有会话并开始新的会话 (通常不是一个好主意) 之外,还有几种方法可以重新初始化软件包变量:

-重新编译包
-使用dbms_session对变量进行重新设置

继续上面的示例:

alter package pkg compile;
exec pkg.p;

The value of v is: 2

update t set x = 3;
commit;

exec dbms_session.modify_package_state(dbms_session.reinitialize);
select f, x from t;

F  X  
3  3  

set serveroutput on
exec pkg.p;

The value of v is: 3


重新编译包只是为了重置包状态是一个坏主意。而modify_package_state只影响当前会话。因此,您需要找到一种方法在适当的时间在每个会话中调用此功能。

或者,您可以将包声明为 “serially_reusable”。在这种情况下,包变量仅在调用期间持续存在。因此,代码会更快地进行任何更改:

delete t;
insert into t values (1);
commit;

create or replace package pkg as
  pragma serially_reusable;
  v pls_integer := f;
  procedure p;
end pkg;
/

create or replace package body pkg as
  pragma serially_reusable;
  procedure p as
  begin
    dbms_output.put_line('The value of v is: ' || pkg.v);
  end p;
end pkg;
/

set serveroutput on
exec pkg.p;

The value of v is: 1

update t set x = 2;
commit;

select * from t;

X  
2  

exec pkg.p;

The value of v is: 2


这里的问题是初始化将为每个新调用运行。因此,如果您的软件包 “大量执行”,则会增加大量执行SQL的开销,这些SQL会提供一遍又一遍的值...
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论