问题描述
嗨,
在我的代码中,我通过一个自定义函数定义了一个常量,该函数从数据库中获取一些数据并创建一个自定义类型的实例。如果函数的返回值随时间变化,我想知道哪个事件会触发该常量的刷新。
我希望每天都会发生这样的事情。
这里是常数定义:
tnkz
在我的代码中,我通过一个自定义函数定义了一个常量,该函数从数据库中获取一些数据并创建一个自定义类型的实例。如果函数的返回值随时间变化,我想知道哪个事件会触发该常量的刷新。
我希望每天都会发生这样的事情。
这里是常数定义:
tppag_convers CONSTANT SER_REDD.TB_CHAR3 := ser_redd.fetchChar3Config('UMBR_FUND_CAUS_CONVERS');tnkz
专家解答
如果你想改变某物的价值,那么它 “不是常数”!
无论如何,您可以定义PL/SQL包变量。当您调用包时,数据库为每个会话初始化这些。
例如,您可以创建一个基于SQL语句返回值的函数。将此分配给包级别变量:
包变量保留其值,直到会话结束。所以如果函数返回一个新值,你的变量保持不变:
除了关闭所有会话并开始新的会话 (通常不是一个好主意) 之外,还有几种方法可以重新初始化软件包变量:
-重新编译包
-使用dbms_session对变量进行重新设置
继续上面的示例:
重新编译包只是为了重置包状态是一个坏主意。而modify_package_state只影响当前会话。因此,您需要找到一种方法在适当的时间在每个会话中调用此功能。
或者,您可以将包声明为 “serially_reusable”。在这种情况下,包变量仅在调用期间持续存在。因此,代码会更快地进行任何更改:
这里的问题是初始化将为每个新调用运行。因此,如果您的软件包 “大量执行”,则会增加大量执行SQL的开销,这些SQL会提供一遍又一遍的值...
无论如何,您可以定义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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




