溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

6.PL_SQL——注釋、數據類型的轉換、變量的范圍和限定詞標簽

發布時間:2020-08-03 19:01:46 來源:網絡 閱讀:1375 作者:wuyeyoulanjian 欄目:關系型數據庫


一、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/SQLSQL是無縫銜接的,因此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.

 

當然,也可以同時使用outerinner標簽

 

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的名字。使用限定詞來引用變量,是一個很好的編程習慣,可以防止混淆和沖突。

 

6.PL_SQL——注釋、數據類型的轉換、變量的范圍和限定詞標簽

 

六、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. 分行寫代碼,使代碼更易讀。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女