2. 定義記錄類型變量 很多結(jié)構(gòu)化程序設(shè)計語言都提供了記錄類型的數(shù)據(jù)類型,在PL/SQL中,也支持將多個基本數(shù)據(jù)類型捆綁在一起的記錄數(shù)據(jù)類型。 下面的程序代碼定義了名為myrecord的記錄類型,該記錄類型由整數(shù)型的myrecordnumber和日期型的mycurrentdate基本類型變量組成,srecord是該類型的變量,引用記錄型變量的方法是“記錄變量名.基本類型變量名”。 程序的執(zhí)行部分從tempuser.testtable數(shù)據(jù)表中提取recordnumber字段為68的記錄的內(nèi)容,存放在srecord復(fù)合變量里,然后輸出srecord.mycurrentdate的值,實(shí)際上就是數(shù)據(jù)表中相應(yīng)記錄的currentdate的值。 在【SQLPlus Worksheet】中執(zhí)行下列PL/SQL程序,執(zhí)行結(jié)果如圖9.9所示。 ――――――――――――――――――――――――――――――――――――― set serveroutput on declare type myrecord is record( myrecordnumber int, mycurrentdate date); srecord myrecord; begin select * into srecord from tempuser.testtable where recordnumber=68; dbms_output.put_line(srecord.mycurrentdate); end; ――――――――――――――――――――――――――――――――――――― 【配套程序位置】:第9章/ recordtypedefine.sql。 在PL/SQL程序中,select語句總是和into配合使用,into子句后面就是要被賦值的變量。 3. 使用%rowtype定義變量 使用%type可以使變量獲得字段的數(shù)據(jù)類型,使用%rowtype可以使變量獲得整個記錄的數(shù)據(jù)類型。比較兩者定義的不同:變量名 數(shù)據(jù)表.列名%type,變量名 數(shù)據(jù)表%rowtype。 在【SQLPlus Worksheet】中執(zhí)行下列PL/SQL程序,該程序定義了名為mytable的復(fù)合類型變量,與testtable數(shù)據(jù)表結(jié)構(gòu)相同,執(zhí)行結(jié)果如圖9.10所示。 ――――――――――――――――――――――――――――――――――――― Declare mytable testtable%rowtype; begin select * into mytable from tempuser.testtable where recordnumber=88; dbms_output.put_line(mytable.currentdate); end; ――――――――――――――――――――――――――――――――――――― 【配套程序位置】:第9章/ rowtypedefine.sql。 4. 定義一維表類型變量 表類型變量和數(shù)據(jù)表是有區(qū)別的,定義表類型變量的語法如下: ――――――――――――――――――――――――――――――――――――― type 表類型 is table of 類型 index by binary_integer; 表變量名 表類型; ――――――――――――――――――――――――――――――――――――― 類型可以是前面的類型定義,index by binary_integer子句代表以符號整數(shù)為索引,這樣訪問表類型變量中的數(shù)據(jù)方法就是“表變量名(索引符號整數(shù))”。
在【SQLPlus Worksheet】中執(zhí)行下列PL/SQL程序,該程序定義了名為tabletype1和tabletype2的兩個一維表類型,相當(dāng)于一維數(shù)組。table1和table2分別是兩種表類型變量。 執(zhí)行結(jié)果如圖9.11所示。 ――――――――――――――――――――――――――――――――――――― Declare type tabletype1 is table of varchar2(4) index by binary_integer; type tabletype2 is table of tempuser.testtable.recordnumber%type index by binary_integer; table1 tabletype1; table2 tabletype2; begin table1(1):='大學(xué)'; table1(2):='大專'; table2(1):=88; table2(2):=55; dbms_output.put_line(table1(1)table2(1)); dbms_output.put_line(table1(2)table2(2)); end; ――――――――――――――――――――――――――――――――――――― 【配套程序位置】:第9章/ tabletypedefine1.sql。 “”是連接字符串的運(yùn)算符。 5. 定義多維表類型變量 在【SQLPlus Worksheet】中執(zhí)行下列PL/SQL程序,該程序定義了名為tabletype1的多維表類型,相當(dāng)于多維數(shù)組,table1是多維表類型變量,將數(shù)據(jù)表tempuser.testtable中recordnumber為60的記錄提取出來存放在table1中并顯示。執(zhí)行結(jié)果如圖9.12所示。 ――――――――――――――――――――――――――――――――――――― Declare type tabletype1 is table of testtable%rowtype index by binary_integer; table1 tabletype1; begin select * into table1(60) from tempuser.testtable where recordnumber=60; dbms_output.put_line(table1(60).recordnumbertable1(60).currentdate); end; ――――――――――――――――――――――――――――――――――――― 【配套程序位置】:第9章/ tabletypedefine2.sql。 在定義好的表類型變量里,可以使用count、delete、first、last、next、exists和PRior等屬性進(jìn)行操作,使用方法為“表變量名.屬性”,返回的是數(shù)字。 在【SQLPlus Worksheet】中執(zhí)行下列PL/SQL程序,該程序定義了名為tabletype1的一維表類型,table1是一維表類型變量,變量中插入3個數(shù)據(jù),綜合使用了表變量屬性。 執(zhí)行結(jié)果如圖9.13所示。 ――――――――――――――――――――――――――――――――――――― set serveroutput on Declare type tabletype1 is table of varchar2(9) index by binary_integer; table1 tabletype1; begin table1(1):='成都市'; table1(2):='北京市'; table1(3):='青島市'; dbms_output.put_line('總記錄數(shù):'to_char(table1.count)); dbms_output.put_line('第一條記錄:'table1.first); dbms_output.put_line('最后條記錄:'table1.last); dbms_output.put_line('第二條的前一條記錄:'table1.prior(2)); dbms_output.put_line('第二條的后一條記錄:'table1.next(2)); end; ――――――――――――――――――――――――――――――――――――― 【配套程序位置】:第9章/ tabletypedefine3.sql。
表達(dá)式
變量、常量經(jīng)常需要組成各種表達(dá)式來進(jìn)行運(yùn)算,下面介紹在PL/SQL中常見表達(dá)式的運(yùn)算規(guī)則。 1. 數(shù)值表達(dá)式 PL/SQL程序中的數(shù)值表達(dá)式是由數(shù)值型常數(shù)、變量、函數(shù)和算術(shù)運(yùn)算符組成的,可以使用的算術(shù)運(yùn)算符包括+(加法)、-(減法)、*(乘法)、/(除法)和**(乘方)等。 在【SQLPlus Worksheet】中執(zhí)行下列PL/SQL程序,該程序定義了名為result的整數(shù)型變量,計算的是10+3*4-20+5**2的值,理論結(jié)果應(yīng)該是27。執(zhí)行結(jié)果如圖9.14所示。 ――――――――――――――――――――――――――――――――――――― set serveroutput on Declare result integer; begin result:=10+3*4-20+5**2; dbms_output.put_line('運(yùn)算結(jié)果是:'to_char(result)); end; ――――――――――――――――――――――――――――――――――――― 【配套程序位置】:第9章/ datacompute.sql。 dbms_output.put_line函數(shù)輸出只能是字符串,因此利用to_char函數(shù)將數(shù)值型結(jié)果轉(zhuǎn)換為字符型。 2. 字符表達(dá)式 字符表達(dá)式由字符型常數(shù)、變量、函數(shù)和字符運(yùn)算符組成,唯一可以使用的字符運(yùn)算符就是連接運(yùn)算符“”。 3. 關(guān)系表達(dá)式 關(guān)系表達(dá)式由字符表達(dá)式或數(shù)值表達(dá)式與關(guān)系運(yùn)算符組成,可以使用的關(guān)系運(yùn)算符包括以下9種。 < 小于 > 大于 = 等于(不是賦值運(yùn)算符:=) like 類似于 in 在……之中 <= 小于等于 >= 大于等于 != 不等于 between 在……之間 關(guān)系型表達(dá)式運(yùn)算符兩邊的表達(dá)式的數(shù)據(jù)類型必須一致。 4. 邏輯表達(dá)式 邏輯表達(dá)式由邏輯常數(shù)、變量、函數(shù)和邏輯運(yùn)算符組成,常見的邏輯運(yùn)算符包括以下3種。 NOT:邏輯非 OR:邏輯或 AND:邏輯與 運(yùn)算的優(yōu)先次序?yàn)镹OT、AND和OR。