創建包時的錯誤記錄:
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
只有重新編譯之後,實例化纔會無效。
包中的子程序聲明與定義
聲明和定義的函數頭必須相同,不敢是參數名還是 參數類型及參數個數。