在包启动时自动执行代码
Automatically execute code on package startup
我即将参加考试,并且有一个规范,但我不确定它是什么意思。能否给我一些提示或给我一个简短的例子。
Specification: Automatically execute code on package Startup:
If criteria met: Code written that automatically initialises variable
without explicit call from user.
我不确定这是否被问到,但我是否必须像这样调用包:PACKAGE_NAME.function_name
所以调用没有值?是这样问的吗?
如果是这样,你不需要进一步帮助我,因为我知道该怎么做。
您可以在包体中包含不属于任何私有或 public 函数或过程的代码;该代码在每个会话实例化包时执行。
作为一个人为的例子,您可能想用初始化时间填充一个变量,您可以这样做:
create package p42 as
procedure some_proc;
end p42;
/
create package body p42 as
init_time timestamp;
procedure some_proc is
begin
-- do something
null;
end some_proc;
-- run on package instantiation
begin
init_time := systimestamp;
-- just as a demo
dbms_output.put_line('init_time is ' || init_time);
end p42;
/
当为每个会话实例化包时,最后一个块是 运行,即当第一个过程或函数被该会话调用时,不是编译:
Package body P42 compiled
set serveroutput on
exec p42.some_proc;
PL/SQL procedure successfully completed.
init_time is 19-MAY-15 15.41.29.179387
...而不是在从 相同 会话调用其他过程时:
exec p42.some_proc;
PL/SQL procedure successfully completed.
以后可以引用该变量。当然,拥有该变量意味着您现在拥有包状态,这会导致其自身的问题。但是您可以在初始化期间调用其他过程。
在文档中阅读更多内容; about instantiation, state, and the initialisation part of the package body:
Finally, the body can have an initialization part, whose statements initialize public variables and do other one-time setup steps. The initialization part runs only the first time the package is referenced. The initialization part can include an exception handler.
你可以这样做:
CREATE OR REPLACE PACKAGE MY_PACKAGE AS
FUNCTION GiveMeFive RETURN NUMBER;
END MY_PACKAGE;
/
CREATE OR REPLACE PACKAGE BODY MY_PACKAGE IS
five NUMBER;
FUNCTION GiveMeFive RETURN NUMBER IS
BEGIN
RETURN five;
END GiveMeFive;
-- By this syntax the procedure is running once when this package is executed first time within a session
BEGIN
five := 5;
END;
/
注意,包体必须按/
关闭,不要使用
BEGIN
five := 5;
END;
END MY_PACKAGE;
/
我即将参加考试,并且有一个规范,但我不确定它是什么意思。能否给我一些提示或给我一个简短的例子。
Specification: Automatically execute code on package Startup:
If criteria met: Code written that automatically initialises variable without explicit call from user.
我不确定这是否被问到,但我是否必须像这样调用包:PACKAGE_NAME.function_name
所以调用没有值?是这样问的吗?
如果是这样,你不需要进一步帮助我,因为我知道该怎么做。
您可以在包体中包含不属于任何私有或 public 函数或过程的代码;该代码在每个会话实例化包时执行。
作为一个人为的例子,您可能想用初始化时间填充一个变量,您可以这样做:
create package p42 as
procedure some_proc;
end p42;
/
create package body p42 as
init_time timestamp;
procedure some_proc is
begin
-- do something
null;
end some_proc;
-- run on package instantiation
begin
init_time := systimestamp;
-- just as a demo
dbms_output.put_line('init_time is ' || init_time);
end p42;
/
当为每个会话实例化包时,最后一个块是 运行,即当第一个过程或函数被该会话调用时,不是编译:
Package body P42 compiled
set serveroutput on
exec p42.some_proc;
PL/SQL procedure successfully completed.
init_time is 19-MAY-15 15.41.29.179387
...而不是在从 相同 会话调用其他过程时:
exec p42.some_proc;
PL/SQL procedure successfully completed.
以后可以引用该变量。当然,拥有该变量意味着您现在拥有包状态,这会导致其自身的问题。但是您可以在初始化期间调用其他过程。
在文档中阅读更多内容; about instantiation, state, and the initialisation part of the package body:
Finally, the body can have an initialization part, whose statements initialize public variables and do other one-time setup steps. The initialization part runs only the first time the package is referenced. The initialization part can include an exception handler.
你可以这样做:
CREATE OR REPLACE PACKAGE MY_PACKAGE AS
FUNCTION GiveMeFive RETURN NUMBER;
END MY_PACKAGE;
/
CREATE OR REPLACE PACKAGE BODY MY_PACKAGE IS
five NUMBER;
FUNCTION GiveMeFive RETURN NUMBER IS
BEGIN
RETURN five;
END GiveMeFive;
-- By this syntax the procedure is running once when this package is executed first time within a session
BEGIN
five := 5;
END;
/
注意,包体必须按/
关闭,不要使用
BEGIN
five := 5;
END;
END MY_PACKAGE;
/