一個PL/SQL塊最多由4個不一樣單元組成,只有一個單元是必不可少的。數據庫
塊頭(Header)ide
只有命名塊纔會有這個單元。塊頭單元就肯定了這個命名塊或者程序的調用方式,事件
這個單元是可選的。字符串
聲明單元(Declaration section)it
這部分定義變量,遊標,以及能夠被後面的執行單元或異常處理單元引用的子塊。io
這一單元也是可選的。編譯
執行單元(Execution section)class
這部分包含了PL/SQL引擎在運行時要執行的語句,這個單元是必須的。變量
異常處理單元select
這部分處理的是正常處理過程當中拋出的異常(根據警告和錯誤條件),這一單元也是可選的。
匿名塊使用場景:
1.數據庫觸發器
當一特定事件發生時能夠出發數據庫觸發器,然後者能夠執行匿名塊
2.即席命令或腳本文件
在SQL*Plus環境中,手工輸入代碼或腳本執行,腳本中調用匿名塊。
使用EXECUTE命令。
3.編譯後的3GL程序
PL/SQL標示符默認屬性:
1.長度最多有30個字符;
2.必須用字母開始;
3.能夠帶有$,_,#
4.不能帶有任何「空白」字符
直接量:只是一個值
數字:
415,21.6,3,141592654f,7D,NULL
字符串
'This is my sentence','01-OCT-1986',q'!hello!',NULL
時間間隔
INTERVAL '25-6' YEAR TO MONTH,INTERVAL '-18' MONTH,NULL
布爾值
TRUE,FALSE,NULL
TO_DATE('01-OCT-1986','DD-MON-YYYY')
TO_TIMESTAMP_TZ('01-OCT-1986 00:00:00 -6','DD-MON-YYYY HH24:MI:SS TZH')
字符串大小寫敏感
日期格式敏感
NULL的問題
在PL/SQL中給一個VARCHAR2(n)變量賦值一個長度爲0的字符串時,致使的結果就是NULL。
DECLARE
str VARCHAR2(1) := '';
BEGIN
IF str IS NULL THEN --結果是TRUE
DBMS_OUTPUT.PUT_LINE('hello');
END IF;
END;
/
SQL> DECLARE
2 str VARCHAR2(1) := '';
3 BEGIN
4 IF str IS NULL THEN
5 DBMS_OUTPUT.PUT_LINE('hello');
6 END IF;
7 END;
8 /
hello
PL/SQL procedure successfully completed
數據庫在處理VARCHAR2類型的表列時也是同樣的。
在PL/SQL中給一個CHAR(n)變量賦值一個長度爲0的字符串時,數據庫會用空格字符填滿這個變量,於是這個變量不爲空。
DECLARE
flag CHAR(2) := '';
BEGIN
IF flag IS NULL THEN
DBMS_OUTPUT.PUT_LINE('great');
ELSIF flag = ' ' THEN
DBMS_OUTPUT.PUT_LINE('bad');
END IF;
END;
SQL> DECLARE
2 flag CHAR(2) := ''; --用一個長度爲零的字符串給CHAR(2)賦值
3 BEGIN
4 IF flag IS NULL THEN --結果是FALSE
5 DBMS_OUTPUT.PUT_LINE('great');
6 ELSIF flag = ' ' THEN --結果是TRUE
7 DBMS_OUTPUT.PUT_LINE('bad');
8 END IF;
9 END;
10 /
bad
PL/SQL procedure successfully completed
這種行爲只有在PL/SQL中才能看到。在數據庫中,當咱們要向一個CHAR(n)的列插入長度爲0的字符串時,數據庫不會用空格把列的內容填滿,而是NULL。
可見,ORACLE只是部分知足了ANSI 92和ANSI 99的標準,標準要求一個長度爲零的字符串和NULL字符串必需要有所區別。
在一個直接量字符串中嵌入單引號
要求顯示'hello'字符串,帶上單引號。
在ORACLE 10g以前,咱們必須這樣作:
SQL> select '''hello''' from dual;
'''HELLO'''
-----------
'hello'
ORACLE 10g引入了自定義的分隔符,用q來標記咱們的分隔符,而後用單引號把分割表達式包圍起來。
SQL> select q'['hello']' from dual;
Q'['HELLO']'
------------
'hello'