PLSQL Language Reference-PL/SQL語言基礎-詞彙單元-宣告

LuiseDalian發表於2014-03-06

宣告

宣告為指定型別的值分配儲存空間,並命名該儲存空間,這樣才能引用它。

必須在引用物件之前宣告它。

宣告可以出現在塊、子程式和包的宣告部分。

變數宣告

變數的宣告需要指定變數的名稱和資料型別。對於大多數的資料型別,變數宣告也可以指定初始值。

變數名必須是有效的使用者定義的識別符號。

資料型別可以是任何PL/SQL資料型別。PL/SQL資料型別包括SQL資料型別。

資料型別可以是scalar(標量的)(不包含內部成員的)也可以是複合的(包含內部成員的)


 

--宣告變數

DECLARE

  part_number       NUMBER(6);     -- SQL資料型別

  part_name         VARCHAR2(20);  -- SQL資料型別

  in_stock          BOOLEAN;        -- PL/SQL資料型別

  part_price        NUMBER(6,2);   -- SQL資料型別

  part_description  VARCHAR2(50);-- SQL資料型別

BEGIN

  NULL;

END;

常量宣告

常量的宣告相對於變數有2個附加要求:關鍵字CONSTANT和常量的初始值。(常量的初始值是它的永久的值)

DECLARE

    credit_limit     CONSTANT REAL    := 5000.00;  -- SQL資料型別

    max_days_in_year CONSTANT INTEGER := 366;      -- SQL資料型別

    urban_legend     CONSTANT BOOLEAN := FALSE;    -- PL/SQL資料型別

BEGIN

  NULL;

END;

變數和常量的初始值

在變數的宣告中初始值是可選的,除非指定了NOT NULL約束。

在常量的宣告中初始值是必須的。

如果宣告是在一個塊或子程式中,則每當程式執行到塊或子程式時,初始值都被賦值給變數或常量;如果宣告是在包規範中,則這個初始值在每個會話中被賦值一次。(無論是私有還是公有的)

進行初始賦值使用:=DEFAULT關鍵字,後面跟一個表示式。表示式中可以包含前面宣告的常量或已經被初始化的變數。


 

-- 11g12_02_11.tst

DECLARE

    hours_worked    INTEGER := 40;

    employee_count  INTEGER := 0;

    pi     CONSTANT REAL := 3.14159;

    radius          REAL := 1;

    area            REAL := (pi * radius**2);

BEGIN

    NULL;

END;

 

DECLARE

    counter INTEGER;  -- 預設的初始值為NULL

BEGIN

    counter := counter + 1;  -- NULL + 1 仍然是NULL

 

    IF counter IS NULL THEN

        DBMS_OUTPUT.PUT_LINE('counter = NULL.');

    END IF;

END;


非空約束

可以將NOT NULL約束施加於scalar變數或常量上。NOT NULL約束可以防止給它們賦NULL值。成員可以隱式地(從它的資料型別獲得)或顯式地獲得NOT NULL約束。


 

DECLARE

    --顯式指定NOT NULL約束

    acct_id INTEGER(4) NOT NULL := 9999;

    -- 隱式地從相應的資料型別獲得NOT NULL約束

    a NATURALN                  := 9999;

    b POSITIVEN                 := 9999;

    c SIMPLE_INTEGER           := 9999;

BEGIN

    NULL;

END;

 


 

PL/SQL把任何長度為0的字串看作是NULL,包括字元函式和BOOLEAN表示式的返回值。

DECLARE

    null_string  VARCHAR2(80) := TO_CHAR('');

    address      VARCHAR2(80);

    zip_code     VARCHAR2(80) := SUBSTR(address, 25, 0);

    name         VARCHAR2(80);

    valid        BOOLEAN      := (name != '');

BEGIN

    IF null_string IS NULL THEN

        DBMS_OUTPUT.PUT_LINE('null_string = NULL');

    END IF;

   

    IF address IS NULL THEN

        DBMS_OUTPUT.PUT_LINE('address = NULL');

    END IF;

   

    IF zip_code IS NULL THEN   

        DBMS_OUTPUT.PUT_LINE('zip_code = NULL');

    END IF;

   

    IF name IS NULL THEN   

        DBMS_OUTPUT.PUT_LINE('name = NULL');

    END IF;

   

    IF valid IS NULL THEN  

        DBMS_OUTPUT.PUT_LINE('valid = NULL');

    END IF;

END;


%type屬性

可以用來宣告與先前宣告的變數或列具有相同資料型別的資料元素,而不需要知道具體是什麼型別。

如果被引用的成員改變了,則宣告的成員隨之改變。

引用成員 被引用成員%TYPE;

引用成員從被引用成員繼承:

n  資料型別和大小

n  約束(除非被引用成員是列)

引用成員不繼承被引用成員的初始值。因此如果引用成員被指定或繼承了NOT NULL約束,就必須為它指定初始值。

該屬性在宣告變數儲存資料庫值的時候非常有用。

變數名 表名.列名%TYPE;

 

DECLARE

    --employees.last_nameNOT NULL約束,但不會繼承

    surname  employees.last_name%TYPE;

BEGIN

    --不會繼承被值

    DBMS_OUTPUT.PUT_LINE('surname=' || surname);

END;



 

DECLARE

    name     VARCHAR(25) NOT NULL := 'Smith';

    --繼承了nameNOT NULL約束

    surname  name%TYPE := 'Jones';

BEGIN

    DBMS_OUTPUT.PUT_LINE('name=' || name);

    DBMS_OUTPUT.PUT_LINE('surname=' || surname);

END;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1102573/,如需轉載,請註明出處,否則將追究法律責任。

相關文章