7.2.2 标量类型的变量
标量类型的变量是最简单类型的变量,也是普通开发者最常用的一种变量类型,它本身是单一的值,不包含任何的类型组合。标量类型主要包含数值类型、字符类型、布尔类型和日期类型。还有一种比较特殊的声明变量类型的方式,就是利用%TYPE。下面对这几种类型做详细的介绍。
1)数值类型,主要用来存放数字型的数据。最常用的就是NUMBER、PLS_INTEGER、BINARY_INTENER类型,还有一个类型是SIMPLE_INTEGER。
❑NUMBER类型可以表示整数和浮点数,该类型以十进制存储。其通用格式是NUMBER(precision,scale),其中的precision表示精度,也就是数字的位数,可达38位;scale表示小数点后的位数。例如,NUMBER(3,1)可以存储-99.9~99.9之间的数值。该类型在定义的时候可以把precision和scale省略。例如,可以定义成NUMBER(8)或NUMBER。
❑PLS_INTEGER和BINARY_INTENER类型通常可以认为是一样的类型。表示的范围是-2 147 483 648~2 147 483 647之间。二者不一样的地方就是BINARY_INTENER发生溢出的时候能为其指派一个NUMBER类型而不至于发生异常,但PLS_INTEGER溢出会发生异常,建议使用PLS_INTEGER类型。
❑SIMPLE_INTEGER类型属于PLS_INTEGER的子类型,它的取值范围同PLS_INTEGER一样,只是该类型不允许为空。如果数据本身不需要溢出检查而且也不可能是空,那么可以选择该类型,该类型的性能比PLS_INTEGER高。
2)字符类型,可以用来存储单个的字符或字符串的类型。主要有CHAR、VARCHAR2(VARCHAR)、NCHAR、NVARCHAR2和LONG类型。
❑CHAR类型,用来描述固定长度的字符串,最长为32 767个字节,默认是长度1。该类型的字符中如果值的长度达不到定义的长度,那么将以空格补齐。通常定义格式为CHAR(maximum_size)。一旦使用该类型,那么在数据库提取数据时可能要做空格处理。
❑VARCHAR2类型,作为变量的时候最长为32 767个字节,但作为字段存储的时候是4000个字节。该类型表示可变长度的字符串。也就是说,当值的长度达不到定义的长度时,不用空格补齐,这样就可以节省一定的空间。
❑NCHAR、NVARCHAR2类型使用方式同CHAR和VARCHAR2相同,只不过它们与国家的字符集有关。
❑LONG类型,以可变的方式存储数据,PL/SQL中作为变量可表示最长可达32 760字节的字符串,如果作为存储字段则可达2GB。
3)布尔类型,它不能用做定义表中的数据类型。但PL/SQL中该类型可以用来存储逻辑上的值。它有3个值可选:TRUE、FALSE、NULL。
4)日期类型,主要有DATE和TIMESTAMP。
❑DATE类型可以存储月、年、日、世纪、时、分和秒。
❑TIMESTAMP类型由DATE演变而来,可以存储月、年、日、世纪、时、分和秒以及小数的秒。
5)使用%TYPE方式定义变量类型。这种定义变量类型的方式和前面所介绍的直接定义变量类型有所不同,它利用已经存在的数据类型来定义新数据的数据类型。例如,当定义多个变量或常量时,只要前面使用过的数据类型,后面的变量就可以利用%TYPE引用。最常见的就是把表中字段类型作为变量或常量的数据类型。使用此种方式的好处有如下几点:
❑利用%TYPE定义的变量或常量数据类型都一致,当有变动的需求时,只要改变被引用的变量或常量的数据类型,其他引用处的数据类型自然就变了,避免了逐条修改的麻烦。
❑使用PL/SQL语句块通常都是操作数据库表的数据,操作过程中避免不了出现数据的传递,这时变量利用%TYPE就可以完全兼容提取的数据,而不至于出现数据溢出或不符的情况。
❑当利用%TYPE定义数据类型时,可以保证变量的数据类型和表中的字段类型同步,当表字段类型发生变化时,PL/SQL块变量的数据类型不需要修改。
【示例5】变量定义示例
示例演示如何定义标量类型的变量。具体演示脚本如下:
01 DECLARE
02 v_productid productinfo.productid%TYPE;—产品ID
03 v_productname VARCHAR2(20);—产品名称
04 v_productprice NUMBER(8,2);—产品价格
05 v_quantity NUMBER(10);—数量
06 v_desperation CONSTANT v_productname%TYPE:='测试';—测试
07
08 v_spitgr SIMPLE_INTEGER:=99.9;
09 v_long LONG:='LONG类型测试';
10 v_date DATE:=SYSDATE;
11 BEGIN
12 SELECT productid,productname,productprice,quantity
13 INTO v_productid,v_productname,v_productprice,v_quantity
14 FROM productinfo
15 WHERE productid='0240040001';
16
17 DBMS_OUTPUT.PUT_LINE('v_productid='||v_productid);
18 DBMS_OUTPUT.PUT_LINE('v_productname='||v_productname
19 ||'长度='||LENGTH(v_productname));
20 DBMS_OUTPUT.PUT_LINE('v_productprice='||v_productprice);
21 DBMS_OUTPUT.PUT_LINE('v_quantity='||v_quantity);
22 DBMS_OUTPUT.PUT_LINE('v_desperation='||v_desperation);
23 DBMS_OUTPUT.PUT_LINE('v_spitgr='||v_spitgr);
24 DBMS_OUTPUT.PUT_LINE('v_long='||v_long);
25 DBMS_OUTPUT.PUT_LINE('v_date='||v_date);
26 END;
【代码解析】
❑该语句块中的声明部分采用了右对齐的方式。
❑第2行利用%TYPE方式声明变量,表示变量v_productid的类型同表productinfo中的productid字段数据类型一致。
❑第3行表示数据类型是长度为20的VARCHAR2型。前面介绍过,该类型可变地存储数据,可以利用LENGTH()函数查看真实长度。
❑第4~5行是NUMBER类型的不同使用方式。
❑第6行利用%TYPE引用了v_productname的数据类型,并且声明了一个常量。
❑第8行初始值是99.9,但由于数据类型只能表示整数,所以变量v_spitgr的值应为100。
❑第11~26行属于执行体部分。
❑第12~15行表示从产品表查询数据,并存储到变量中。
❑第17~25行表示输出结果到屏幕,用于验证变量存储数据。
【执行效果】
打开SQL*Plus执行以上脚本,执行流程见图7.6。
图 7.6 变量类型声明演示