创建包时的错误记录:
CREATE OR REPLACE PACKAGE BODY Random IS
BEGINv_Multiplier CONSTANT NUMBER:=1234324;
v_Increment CONSTANT NUMBER:=1;
v_Seed NUMBER := 1;
PROCEDURE ChangeSeed(p_NewSeed IN NUMBER) IS
BEGIN
v_Seed := p_NewSeed;
END ChangeSeed;
END Random;
报错信息如下:
3/15 PLS-00103: Encountered the symbol "CONSTANT" when expecting one
of the following:
:= . ( @ % ;
11/1 PLS-00103: Encountered the symbol "END" when expecting one of
the following:
begin function package pragma procedure form
错误点:
1
CREATE OR REPLACE PACKAGE BODY Random IS
BEGIN头部分多了一个 BEGIN 。所以一直报 END 有问题。
2.对于CONSTANT 的问题。
则应该是BEGIN 引起的连锁反应。
加BEGIN后,变量就要用 DECLARE 进行声明
包的初始化:
CREATE OR REPLACE PACKAGE BODY Random AS
v_Multiplier number:=1234324;
v_Increment number:=1;
v_Seed number := 1;
PROCEDURE ChangeSeed IS
BEGIN
--v_Seed := 1;
dbms_output.PUT_LINE(v_Seed);
END ChangeSeed;
PROCEDURE ChangeSeed2 IS
BEGIN
v_Seed := 100;
dbms_output.PUT_LINE(v_Seed);
END ChangeSeed2;
BEGIN
dbms_output.PUT_LINE('haha');
END Random;
事实证明,这个包的运行方式的确很疼
对于每一个会话来说,第一次运行之后,包就被示例化了,尤其是其中的变量。
初始化部分只在第一次调用时运行,而且先于对其他成员的调用。
begin
begin
Random.ChangeSeed();
random.changeseed2;
end;
begin
Random.ChangeSeed();
random.changeseed2;
end;
Random.ChangeSeed();
random.changeseed2;
end;
上面的执行语句执行两次之后的结果如下
第一次
haha
1
100
100
100
100
100
第二次及第n次
100
100
100
100
100
100
只有重新编译之后,实例化才会无效。
包中的子程序声明与定义
声明和定义的函数头必须相同,不敢是参数名还是 参数类型及参数个数。