在程序包启动时自动执行代码

时间:2015-05-19 14:26:41

标签: oracle plsql packages

我的考试即将开始并且有一个规格,我不确定它的含义。请给我一个提示或给我一个简短的例子。

  

规范:自动执行包启动时的代码:

     

如果满足条件:编写的代码自动初始化变量   没有来自用户的明确调用。

我不确定是否会被问到这个问题但是我必须像这样调用这个包:PACKAGE_NAME.function_name这样一个没有值的调用?那是什么问题?

如果是这样,你不需要进一步帮助我,因为我知道该怎么做。

2 个答案:

答案 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 instantiationstatethe 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;
/
相关问题