ORacle Package

創建包時的錯誤記錄:

CREATE OR REPLACE PACKAGE BODY Random IS 

BEGIN
v_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


只有重新編譯之後,實例化纔會無效。


包中的子程序聲明與定義

聲明和定義的函數頭必須相同,不敢是參數名還是 參數類型及參數個數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章