官术网_书友最值得收藏!

5.2 數據類型、變量和常量

視頻講解:光盤\TM\lx\5\數據類型與定義變量.mp4

數據類型本質上是一種用于描述數據存儲的內存結構,用它來決定變量中所存儲數據的類型。而變量本質上是一種用名稱進行識別的標示符號,它可以存儲不同類型的數據。根據不同的數據類型,定義不同名稱的變量,這樣就可以存儲不同類型的數據。變量在程序運行的過程中,其值可以發生變化,與變量對應的就是常量,常量就是指在程序運行的過程中,其值不會發生變化的量。

5.2.1 基本數據類型

與其他編程語言一樣,PL/SQL語言也有多種數據類型,這些數據類型能夠滿足在編寫PL/SQL程序過程中定義變量和常量之用,本節主要介紹在編寫PL/SQL程序時經常用到的基本數據類型。

1.數值類型

數值類型主要包括NUMBER、PLS_INTEGER和BINARY_INTEGER三種基本類型。其中,NUMBER類型的變量可以存儲整數或浮點數,而BINARY_INTEGER或PLS_INTEGER類型的變量只能存儲整數。

NUMBER類型還可以通過NUMBER(P, S)的形式來格式化數字,其中,參數P表示精度,參數S表示刻度范圍。精度是指數值中所有有效數字的個數,而刻度范圍是指小數點右邊小數位的個數,在這里精度和刻度范圍都是可選的。下面通過一個示例來具體講解一下。

【例5.4】 聲明一個精度為9,且刻度范圍為2的表示金額的變量Num_Money,代碼如下。

        Num_Money NUMBER(9,2);

PL/SQL語言出于代碼可讀性或與來自其他編程語言的數據類型相兼容的考慮,提出了“子類型”的概念,所謂子類型就是與NUMBER類型等價的類型別名,甚至可以說是NUMBER類型的多種重命名形式,這些等價的子類型主要包括DEC、DECIMAL、DOUBLE、INTEGER、INT、NUMERIC、SMALLINT、BINARY_INTEGER、PLS_INTEGER等。

2.字符類型

字符類型主要包括VARCHAR2、CHAR、LONG、NCHAR和NVARCHAR2等。這些類型的變量用來存儲字符串或字符數據。下面對這幾種字符類型進行講解。

(1)VARCHAR2類型

PL/SQL語言中的VARCHAR2類型和數據庫類型中的VARCHAR2比較類似,用于存儲可變長度的字符串,其聲明語法格式為:

        VARCHAR2(maxlength)

參數maxlength表示可以存儲字符串的最大長度,這個參數值在定義變量時必須給出(因為VARCHAR2類型沒有默認的最大長度),參數maxlength的最大值可以是32767。

注意

數據庫類型的VARCHAR2的最大長度是4000字節,所以一個長度大于4000字節的PL/SQL類型VARCHAR2變量不可以賦值給數據庫中的一個VARCHAR2變量,而只能賦值給LONG類型的數據庫變量。

(2)CHAR類型

CHAR類型表示指定長度的字符串,其語法格式如下:

        CHAR(maxlength)

參數maxlength是指可存儲字符串的最大長度,以字節為單位,最大為32767字節,CHAR類型的默認最大長度為1。與VARCHAR2不同,maxlength可以不指定,默認為1。如果賦給CHAR類型的值不足maxlength,則會在其后面用空格補全,這也是不同于VARCHAR2的地方。

注意

數據庫類型中的CHAR只有2000字節,所以如果PL/SQL中CHAR類型變量的長度大于2000個字節,則不能賦給數據庫中的CHAR。

(3)LONG類型

LONG類型表示一個可變的字符串,最大長度是32767字節,而數據庫類型的LONG最大長度可達2GB,所以幾乎任何字符串變量都可以賦值給它。

(4)NCHAR和NVARCHAR2類型

NCHAR和NVARCHAR2類型是PL/SQL8.0以后才加入的類型,它們的長度要根據各國字符集來確定,只能具體情況具體分析。

3.日期類型

日期類型只有一種—DATE類型,用來存儲日期和時間信息,DATE類型的存儲空間是7個字節,分別使用一個字節存儲世紀、年、月、天、小時、分鐘和秒。

4.布爾類型

布爾類型也只有一種—即BOOLEAN,主要用于程序的流程控制和業務邏輯判斷,其變量值可以是TRUE、FALSE或NULL中的一種。

5.2.2 特殊數據類型

為了提高用戶的編程效率和解決復雜的業務邏輯需求,PL/SQL語言除了可以使用Oracle規定的基本數據類型外,還提供了3種特殊的數據類型,但這3種類型仍然是建立在基本數據類型基礎之上的。

1.%TYPE類型

使用%TYPE關鍵字可以聲明一個與指定列相同的數據類型,它通常緊跟在指定列名的后面。

【例5.5】 聲明了一個與emp表中job列的數據類型完全相同的變量var_job,代碼如下。

        declare
          var_job emp.job%type;

在上面的代碼中,若emp.job列的數據類型為VARCHAR2(10),那么變量var_job的數據類型也是VARCHAR2(10),甚至可以把“emp.job%type”就看做是一種能夠存儲指定列類型的特殊數據類型。

使用%TYPE定義變量有兩個好處:第一,用戶不必查看表中各個列的數據類型,就可以確保所定義的變量能夠存儲檢索的數據;第二,如果對表中已有列的數據類型進行修改,則用戶不必考慮對已定義的變量所使用的數據類型進行更改,因為%TYPE類型的變量會根據列的實際類型自動調整自身的數據類型。

【例5.6】 在scott模式下,使用%type類型的變量輸出emp表中編號為7369的員工名稱和職務信息,代碼如下(實例位置:光盤\TM\sl\5\2)

        SQL> set serveroutput on
        SQL> declare
          2   var_ename emp.ename%type;                                 --聲明與ename列類型相同的變量
          3   var_job emp.job%type;                                     --聲明與job列類型相同的變量
          4  begin
          5   select ename, job
          6   into var_ename, var_job
          7   from emp
          8   where empno=7369;                                         --檢索數據,并保存在變量中
          9   dbms_output.put_line(var_ename||’的職務是’||var_job);    --輸出變量的值
         10  end;
         11  /

本例運行結果如圖5.2所示。

圖5.2 使用%type類型定義變量并輸出

另外,在上面代碼中使用into子句,它位于select子句的后面,用于設置將從數據庫檢索的數據存儲到哪個變量中。

注意

由于into子句中的變量只能存儲一個單獨的值,所以要求select子句只能返回一行數據,這個由where子句進行了限定。若SELECT子句返回多行數據,則代碼運行后會返回錯誤信息。

2.RECORD類型

單詞RECORD有“記錄”之意,因此RECORD類型也稱作“記錄類型”,使用該類型的變量可以存儲由多個列值組成的一行數據。在聲明記錄類型變量之前,首先需要定義記錄類型,然后才可以聲明記錄類型的變量。記錄類型是一種結構化的數據類型,它使用type語句進行定義,在記錄類型的定義結構中包含成員變量及其數據類型,其語法格式如下。

        type record_type is record
        (
        var_member1 data_type [not null] [:=default_value],
        …
        var_membern data_type [not null] [:=default_value])

record_type:表示要定義的記錄類型名稱。

var_member1:表示該記錄類型的成員變量名稱。

data_type:表示成員變量的數據類型。

從上面的語法結構中可以看出,記錄類型的聲明類似于C或C++中的結構類型,并且成員變量的聲明與普通PL/SQL變量的聲明相同。下面通過一個實例來了解如何聲明和使用RECORD類型。

【例5.7】 聲明一個記錄類型emp_type,然后使用該類型的變量存儲emp表中的一條記錄信息,并輸出這條記錄信息,代碼如下(實例位置:光盤\TM\sl\5\3)

        SQL> set serveroutput on
        SQL> declare
          2   type emp_type is record                --聲明record類型emp_type
          3   (
          4     var_ename varchar2(20),             --定義字段/成員變量
          5     var_job varchar2(20),
          6     var_sal number
          7   );
          8   empinfo  emp_type;                  --定義變量
          9  begin
         10   select ename, job, sal
         11   into empinfo
         12   from emp
         13   where empno=7369;                  --檢索數據
         14   /*輸出雇員信息*/
         15      dbms_output.put_line(' 雇員 '||empinfo.var_ename||' 的職務是 '||empinfo.var_job||' 、工資是
        '||empinfo.var_sal);
         16  end;
         17  /

本例運行結果如圖5.3所示。

圖5.3 定義和使用記錄類型

3.%ROWTYPE類型

%ROWTYPE類型的變量結合了“%TYPE類型”和“記錄類型”變量的優點,它可以根據數據表中行的結構定義一種特殊的數據類型,用來存儲從數據表中檢索到的一行數據。它的語法形式很簡單,如下所示。

        rowVar_name table_name%rowtype;

rowVar_name:表示可以存儲一行數據的變量名。

table_name:指定的表名。

在上面的語法結構中,可以不恰當地把“table_name%rowtype”看做是一種能夠存儲表中一行數據的特殊類型。下面通過一個實例來看一下如何定義和使用%ROWTYPE類型。

【例5.8】 聲明一個%ROWTYPE類型的變量rowVar_emp,然后使用該變量存儲emp表中的一行數據,代碼如下(實例位置:光盤\TM\sl\5\4)

        SQL> set serveroutput on
        SQL> declare
          2   rowVar_emp emp%rowtype;             --定義能夠存儲emp表中一行數據的變量rowVar_emp
          3  begin
          4   select*
          5   into rowVar_emp
          6   from emp
          7   where empno=7369;                   --檢索數據
          8   /*輸出雇員信息*/
          9       dbms_output.put_line(' 雇員 '||rowVar_emp.ename||' 的編號是 '||rowVar_emp.empno||', 職務是
        '||rowVar_emp.job);
         10  end;
         11  /

本例運行結果如圖5.4所示。

圖5.4 定義和使用%ROWTYPE類型

從上面的運行結果可以看出,變量rowVar_emp的存儲結構與emp表的數據結構完全相同,這時用戶完全可以使用rowVar_emp變量來代替emp表的某一行數據進行編程操作。

5.2.3 定義變量和常量

在上面的章節中,已經逐步將變量的定義和使用方法介紹給大家,相信讀者對變量并不陌生,本節將主要是對定義變量的規范進行總結。另外,常量在PL/SQL編程中也經常用到,本節也做相應的介紹。

1.定義變量

變量是指其值在程序運行過程中可以改變的數據存儲結構,定義變量必需的元素就是變量名和數據類型,另外還有可選擇的初始值,其標準語法格式如下:

        <變量名> <數據類型> [(長度):=<初始值>];

可見,與很多面向對象的編程語言不同,PL/SQL中的變量定義要求變量名在數據類型的前面,而不是后面;語法中的長度和初始值是可選項,需要根據實際情況而定。

【例5.9】 定義一個用于存儲國家名稱的可變字符串變量var_countryname,該變量的最大長度是50,并且該變量的初始值為“中國”,代碼如下。

        var_countryname varchar2(50):=’中國’;

2.定義常量

常量是指其值在程序運行過程中不可改變的數據存儲結構,定義常量必需的元素包括常量名、數據類型、常量值和constant關鍵字,其標準語法格式如下:

        <常量名> constant <數據類型>:=<常量值>;

對于一些固定的數值,比如圓周率、光速等,為了防止其不慎被改變,最好定義成常量。

【例5.10】 定義一個常量con_day,用來存儲一年的天數,代碼如下。

        con_day constant integer:=365;

3.變量初始化

許多語言沒有規定未經過初始化的變量中應該存放什么內容。因此在運行時,未初始化的變量就可能包含隨機的或者未知的取值。在一種語言中,運行使用未初始化變量并不是一種很好的編程風格。一般而言,如果變量的取值可以被確定,那么最好為其初始化一個數值。

但是,PL/SQL定義了一個未初始化變量應該存放的內容,其被賦值為NULL。NULL意味著“未定義或未知的取值”。換句話講,NULL可以被默認地賦值給任何未經過初始化的變量。這是PL/SQL的一個獨到之處,許多其他程序設計語言沒有定義未初始化變量的取值。

5.2.4 PL/SQL表達式

表達式不能獨立構成語句,表達式的結果是一個值,如果不給這個值安排一個存放的位置,則表達式本身毫無意義。通常,表達式作為賦值語句的一部分出現在賦值運算符的右邊,或者作為函數的參數等。

例如,123*23-24+33就是一個表達式,它是由運算符串連起來的一組數,按照運算符的意義運算會得到一個運算結果,這就是表達式的值。

“操作數”是運算符的參數。根據所擁有的參數個數,PL/SQL運算符可分為一元運算符(一個參數)和二元運算符(兩個參數)。表達式按照操作對象的不同,也可以分為字符表達式和布爾表達式兩種。

1.字符表達式

唯一的字符運算符就是并置運算符“||”,它的作用是把幾個字符串連在一起,如表達式:'Hello'||'World'||'! ’的值等于’Hello World! '。

2.布爾表達式

PL/SQL控制結構都涉及布爾表達式。布爾表達式是一個判斷結果為真還是為假的條件,它的值只有TRUE、FALSE或NULL,如以下表達式所示。

        (x>y);
        NULL;
        (4>5)OR(-1<0);

布爾表達式有3個布爾運算符:AND、OR和NOT,與高級語言中的邏輯運算符一樣,它們的操作對象是布爾變量或者表達式。如:

        A AND B OR 1 NOT C

其中,A、B、C都是布爾變量或者表達式。表達式TRUE AND NULL的值為NULL,因為不知道第二個操作數是否為TRUE。

布爾表達式中的算術運算符如表5.2所示。

表5.2 布爾表達式中的算術運算符

此外,between操作符可以劃定一個范圍,在范圍內則為真,否則為假。如:

1 between 0 and 100表達式的值為真。

IN操作符判斷某一元素是否屬于某個集合,如:

'Scott'IN('Mike', 'Jone', 'Mary')為假。

主站蜘蛛池模板: 鲜城| 贵溪市| 红桥区| 额济纳旗| 高陵县| 南京市| 犍为县| 灯塔市| 璧山县| 凌源市| 峡江县| 龙陵县| 西和县| 新营市| 兴城市| 柘荣县| 开鲁县| 井冈山市| 思南县| 宜宾县| 高淳县| 兰考县| 石门县| 宜黄县| 武川县| 牙克石市| 司法| 临朐县| 黑龙江省| 社旗县| 平阴县| 虹口区| 东至县| 连山| 合山市| 土默特右旗| 武川县| 凤山县| 农安县| 蕉岭县| 布拖县|