一、PL/SQL塊的詞法
PL/SQL中可以使用字母、數字、空格和特殊符號等,主要包括:
標識符——變量、關鍵字、保留字
分隔符——分號,逗號,加號或減號等
常量——字符串,數字,布爾型變量
注釋——單行注釋、多行注釋
編寫PL/SQL程序時,需要注意以下兩點:
1. 字符和日期必須使用單引號引用,單引號中間可以引用雙引號。
2. 數字可以是單獨的數字,也可以使科學計數法。
為了養成良好的編程,最好使用tab鍵對代碼進行縮進,有關鍵字的行回車另起一行,以使程序更加易讀,邏輯結構更加清晰。
二、注釋
PL/SQL和其他編程語言一樣,也經常需要用到注釋。注釋部分程序執行時會自動忽略。它的注釋主要有兩種:
1. 單行注釋:使用-- 表示,注釋的范圍僅限于-- 所在的行;
2. 多行注釋:使用/* */表示,注釋的范圍是/* */所包含的所有行。
如下面這個例子,就同時用到了單行注釋和多行注釋:
SQL> edit
DECLARE v_annual_sal NUMBER (9,2); monthly_sal NUMBER; BEGIN /* Compute the annual salary based on themonthly salary input from the user */ -- 使用了多行注釋 monthly_sal := 3000; v_annual_sal := monthly_sal * 12; -- The following line displays theannual salary -- 使用了單行注釋 DBMS_OUTPUT.PUT_LINE(v_annual_sal); END; /
SQL> /
36000 PL/SQL procedure successfullycompleted.
三、SQL函數在PL/SQL中的應用
PL/SQL和SQL是無縫銜接的,因此SQL的很多函數可以在PL/SQL中直接引用,比如SQL中的單行函數可以直接使用;但是一些GROUP函數和DECODE函數則無法在PL/SQL中使用。不過PL/SQL有自己的條件控制語句,可以做更為靈活的操作。
下面舉幾個SQL函數在PL/SQL中使用的例子:
SQL> edit
DECLARE v_desc_size INTEGER(5); v_prod_description VARCHAR2(70) := 'Youcan use this product with your radios for higher frequency'; BEGIN v_desc_size :=LENGTH(v_prod_description); -- 這里使用了SQL的函數LENGTH() DBMS_OUTPUT.PUT_LINE(v_desc_size); END; /
SQL> /
62 PL/SQL procedure successfully completed.
需要注意的是,Oracle11g之前,PL/SQL中使用遞增函數(Sequences)的方法是:
DECLARE v_new_id NUMBER; BEGIN SELECT my_seq.NEXTVAL INTO v_new_idFROM Dual; -- 需要寫成完整的形式 END;
但是在Oracle11g之后,遞增函數簡化成如下的形式:
DECLARE v_new_id NUMBER; BEGIN v_new_id := my_seq.NEXTVAL; -- 可以寫成簡化的形式了 END;
四、數據類型的轉換
PL/SQL中要進行轉換的數據必須是相似的,比如數字123和字符串’123’是可以互相轉換的,但是’abc’則不能轉換為數字。
PL/SQL中數據類型的轉換主要分兩類:
1. 隱式轉換——隱式轉換是指數據會自動轉換。但是需要注意的是,自動轉換受制于NLS環境變量,如果環境變量沒有進行相應的配置,則有可能無法轉換,因此不推薦這種方式。
下面看一個數據類型轉換的例子:
SQL> edit
DECLARE a_number NUMBER; BEGIN a_number := '125'; -- '125'是個字符串 a_number := a_number + 3; --'125'自動轉換成了數字 DBMS_OUTPUT.PUT_LINE(to_char(a_number,'9999')); -- 使用了to_char這個函數進行顯示轉換 END; /
SQL> @notes/s1.sql
128 PL/SQLprocedure successfully completed.
2. 顯式轉換——使用專用的函數來轉換。如TO_CHAR,TO_DATE, TO_NUMBER, TO_TIMESTAMP等函數。
如要進行日期轉換:
SQL> edit
DECLARE v_date_of_joining DATE; BEGIN v_date_of_joining := TO_DATE('February02,2000','Month DD, YYYY'); -- 使用TO_DATE這個函數進行顯式轉換 DBMS_OUTPUT.PUT_LINE(v_date_of_joining); END; /
SQL> /
02-FEB-00 PL/SQLprocedure successfully completed.
五、塊的嵌套
A. 嵌套塊可以放的位置:
PL/SQL可以嵌套其他的塊,被嵌套的塊可以放在以下兩個部分:
1. 可執行部分,即BEGIN處;
2. 異常處理部分,即EXCEPTION部分。
需要注意的是,嵌套塊最多不要超過3層。
B. 變量的范圍(SCOPE):
內層嵌套塊可以引用外層塊中聲明的變量;
但是外層塊不可以引用內層塊中聲明的變量。
下面來看一個變量引用范圍的例子:
SQL> edit
DECLARE v_outer_variable VARCHAR2(20) :='GLOBAL _VARIABLE'; -- 聲明在外層塊中的變量 BEGIN DECLARE v_inner_variable VARCHAR2(20):= 'LOCAL VARIABLE'; -- 聲明在內層塊中的變量 BEGIN DBMS_OUTPUT.PUT_LINE(v_inner_variable); -- 內層塊中的函數可以引用內層塊聲明的變量 DBMS_OUTPUT.PUT_LINE(v_outer_variable); -- 內層塊的函數也可以引用外層塊聲明的變量 END; DBMS_OUTPUT.PUT_LINE(v_outer_variable); -- 外層塊只能引用聲明在外層塊的變量 END;
SQL> /
LOCALVARIABLE GLOBAL_VARIABLE GLOBAL_VARIABLE PL/SQLprocedure successfully completed.
如果修改一下,在外層塊里引用一下內層塊的變量:
SQL> edit
DECLARE v_outer_variable VARCHAR2(20) :='GLOBAL _VARIABLE'; BEGIN DECLARE v_inner_variable VARCHAR2(20):= 'LOCAL VARIABLE'; BEGIN DBMS_OUTPUT.PUT_LINE(v_inner_variable); DBMS_OUTPUT.PUT_LINE(v_outer_variable); END; DBMS_OUTPUT.PUT_LINE(v_outer_variable); DBMS_OUTPUT.PUT_LINE(v_inner_variable); END; /
SQL> /
DBMS_OUTPUT.PUT_LINE(v_inner_variable); * ERRORat line 11: ORA-06550:line 11, column 23: PLS-00201:identifier 'V_INNER_VARIABLE' must be declared ORA-06550:line 11, column 2: PL/SQL:Statement ignored -- 報錯了,說明無法引用內層塊聲明的變量
C.變量的可見性(visibility)
如果聲明變量時出現了重名的情況,則采用就近原則,優先采用本地的變量,而在外層塊中的變量會被覆蓋(invisibility)。
下面來看一個變量名重名的例子:
SQL> edit
--Example about variable scope and visibility in nest blocks DECLARE v_father_name VARCHAR2(20) :='Patrick'; v_date_of_birth DATE := '20-Apr-1972'; -- 定義了父親的名字和生日 BEGIN DECLARE v_child_name VARCHAR2(20) :='Mike'; v_date_of_birth DATE :='12-Dec-2002'; -- 定義了兒子的名字和生日 BEGIN DBMS_OUTPUT.PUT_LINE('Father''sName: ' || v_father_name); DBMS_OUTPUT.PUT_LINE('Date ofBirth: ' || v_date_of_birth); -- 這里引用了父親的名字 --但是根據就近原則,引用了兒子的生日 DBMS_OUTPUT.PUT_LINE('Child''sName: ' || v_child_name); -- 引用了兒子的名字 END; DBMS_OUTPUT.PUT_LINE('Date of Birth: '|| v_date_of_birth); -- 內層塊執行結束后內存被釋放,此時引用的是父親的生日 END; /
SQL> /
Father'sName: Patrick Dateof Birth: 12-DEC-02 -- 父親的名字,兒子的生日 Child'sName: Mike Dateof Birth: 20-APR-72 --兒子的名字,父親的生日 PL/SQLprocedure successfully completed.
D.使用限定詞標簽引用變量
如果要內層塊一定要引用外層塊的變量,在聲明時使用標簽,引用時指定標簽作為修飾語,則可以避免變量覆蓋的情況。
看下面這組例子:
SQL> edit
BEGIN<<outer>> --使用了標簽<<outer>> DECLARE v_father_name VARCHAR2(20) :='Patrick'; v_date_of_birth DATE := '20-Apr-1972'; BEGIN DECLARE v_child_name VARCHAR2(20) :='Mike'; v_date_of_birth DATE :='12-Dec-2002'; BEGIN DBMS_OUTPUT.PUT_LINE('Father''sName: ' || v_father_name); DBMS_OUTPUT.PUT_LINE('Date ofBirth: ' || outer.v_date_of_birth); -- 引用變量時指明該變量是外層塊中的變量。 DBMS_OUTPUT.PUT_LINE('Child''sName: ' || v_child_name); DBMS_OUTPUT.PUT_LINE('Date ofBirth: ' || v_date_of_birth); -- 這里引用的變量是內層塊的變量 END; END; END outer;
SQL> /
Father'sName: Patrick Dateof Birth: 20-APR-72 Child'sName: Mike Dateof Birth: 12-DEC-02 --這一次父親的名字和生日、孩子的名字和生日能夠匹配了 PL/SQLprocedure successfully completed.
當然,也可以同時使用outer和inner標簽
SQL> edit
BEGIN<<outer>> -- 使用outer標簽 DECLARE v_father_name VARCHAR2(20) :='Patrick'; v_date_of_birth DATE := '20-Apr-1972'; BEGIN<<inner>> -- 使用inner標簽 DECLARE v_child_name VARCHAR2(20) :='Mike'; v_date_of_birth DATE :='12-Dec-2002'; BEGIN DBMS_OUTPUT.PUT_LINE('Father''sName: ' || v_father_name); DBMS_OUTPUT.PUT_LINE('Date ofBirth: ' || outer.v_date_of_birth); -- 引用時指明是outer的變量 DBMS_OUTPUT.PUT_LINE('Child''sName: ' || v_child_name); DBMS_OUTPUT.PUT_LINE('Date ofBirth: ' || inner.v_date_of_birth); -- 引用時指明是inner的變量 END; END; ENDouter; /
SQL> /
Father'sName: Patrick Dateof Birth: 20-APR-72 Child'sName: Mike Dateof Birth: 12-DEC-02 -- 和上一次的執行結果是一致的 PL/SQLprocedure successfully completed.
限定詞除了可以明確指定外,還可以使用包名、Procedure的名字。使用限定詞來引用變量,是一個很好的編程習慣,可以防止混淆和沖突。
六、PL/SQL中的運算符
PL/SQL中的運算符主要包括以下幾類:
1. 邏輯運算符:如AND、OR 和NOT
2. 算術運算符:如+、-、*、/和指數運算符 **
3. 連接符,將多個字符串連起來,如||
PL/SQL的運算規則和SQL一致,如*和/的優先級高于+和-等等,出于安全性考慮,可以通過括號來強制控制運算的順序
七、PL/SQL編程的通用規則
進行PL/SQL編程,建議遵循以下通用規則:
1. 為代碼加注釋;
2. 統一大小寫的規則(關鍵字大寫,自己定義的變量小寫)
3. 確定命名規則,如聲明變量時以v_開頭
4. 通過縮減增強可讀性,很多開發工具集成了格式化的工具,可以自動完成縮減
(在vim 中,可以通過set autointent 設定自動縮進,settabstop=#設定縮進量,其中#表示要縮進的字符數)
5. 分行寫代碼,使代碼更易讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。