我的考试即将开始并且有一个规格,我不确定它的含义。请给我一个提示或给我一个简短的例子。
规范:自动执行包启动时的代码:
如果满足条件:编写的代码自动初始化变量 没有来自用户的明确调用。
我不确定是否会被问到这个问题但是我必须像这样调用这个包:PACKAGE_NAME.function_name
这样一个没有值的调用?那是什么问题?
如果是这样,你不需要进一步帮助我,因为我知道该怎么做。
答案 0 :(得分:6)
您可以在程序包正文中包含不属于任何私有或公共函数或过程的代码;当每个会话实例化包时执行该代码。
作为一个人为的例子,您可能希望使用初始化时间填充变量,您可以使用:
let arrayObject : [AnyObject] = [mynumber,mytext]
NSNotificationCenter.defaultCenter().postNotificationName("refresh", object: arrayObject)
func refreshList(notification: NSNotification){
let arrayObject = notification.object as! [AnyObject]
let receivednumber = arrayObject[0] as! Int
let receivedString = arrayObject[1] as! String
}
当为每个会话实例化包时运行最后一个块,即当该会话调用第一个过程或函数时,以及编译它时不:
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
稍后可以引用该变量。当然,拥有该变量意味着您现在拥有包状态,这会导致其自身的问题。但你可以在初始化期间调用其他程序。
在文档中阅读更多内容; about instantiation,state和the initialisation part of the package body:
最后,正文可以有一个初始化部分,其语句初始化公共变量并执行其他一次性设置步骤。初始化部分仅在第一次引用包时运行。初始化部分可以包括异常处理程序。
答案 1 :(得分:1)
你可以这样做:
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;
/