1.前言
因为工作日需要上班,只能利用业余时间学习,过去五天学习了前三篇文章涉及的内容。收获大概就是对于oracle PL/SQL的理解稍进一层,虽然还是停留在表面上,但是相信随着接下来的学习,自己会对这个东西有越来越深的认识。那么接下来会正式开始PL/SQL的学习。
不多说了,出发了朋友。
前文链接:
Oracle PL/SQL自学(三):数据导出
2.变量的声明和初始化
简单来说,变量的声明要符合以下条件:
1.必须在声明段;
2.必须以英文字母开始;
3.最多30个字符;
4.可包含特殊字符:$(美元号)、_(下划线)、#(井号);
5.不能包含:-(连字符)、/(斜线)、空格等字符;
6.不能与数据库的表或列同名;
7.不能是保留关键字(已定义的过的字);
语法如下:
变量名 [CONSTANT] 数据类型 [NOT NULL] [:= | DEFAULT 表达式];
CONSTANT:声明一个常量,必须初始化;
NOT NULL:声明一个非空变量,必须初始化;
数据类型:可以是一个标量类型、组合类型或LOB类型等;
DEFAULT:初始值;
表达式:可以是任何PL/SQL表达式,可以是文字表达式、其他变量或带有函数和操作符的表达式。
注意:
1.PL/SQL中的赋值操作符是 := 而不是 = 。
2.未初始化的变量,默认置为空。
一段声明的示例:
DECLARE
v_high CONSTANT NUMBER(20) NOT NULL := 180;
v_name VARCHAR(25) := 'TYLOR SWIFT';
f_color VARCHAR(20) := 'PINK';
v_birth DATE;
接着上方声明段,简单写一个执行段:
BEGIN
DBMS_OUTPUT.PUT_LINE('before: ' || v_name || ' like color ' || f_color );
f_color := 'BLUE';
DBMS_OUTPUT.PUT_LINE('after: ' || v_name || ' like color ' || f_color );
END;
执行后得到:
SQL> @G:\oracle\sqltest\test4.2.1.sql
before: TYLOR SWIFT like color PINK
after: TYLOR SWIFT like color BLUE
PL/SQL 过程已成功完成。
SQL>
可以看到变量 f_color 的变化。
3.变量的数据类型
PL/SQL主要支持以下四种变量类型:
(1)标量 scalar:只保持一个依赖于数据类型的单一的值;
(2)组合 composite:包括内部元素(结构),而这些元素既可以是标量类型也可以是组合类型。如RECORD、PL/SQL TABLE;
(3)引用 reference:保存一个指针值;
(4)大对象 LOB:用于保存保存和操作非结构化和半结构化的数据,比如图像、声音、文档等。
PL/SQL提供了很多预定义数据类型,使用最多的是标量数据类型,标量数据类型又可以分为四大类:
(1)数字 number
(2)字符 character
(3)日期 date
(4)布尔 Boolean
同时,数字和字符类型还有一些子类型,先不做赘述。
VARCHAR2(size):基本变长字符型数据,没有默认值,最大值为32767字节;
CHAR(size):基本定长字符型数据,默认值1,最大值为32767字节;
NUMBER(p,s):数字型数据,p为数的精度(位数),s为规模(刻度),p的最小值1,最大值38,s最小值-84,最大值124;
BINARY_INTERGER:基本整型数,取值范围 -2,147,483,647~2,147,483,647;
PLS_INTERGER:基本带符号整型数,取值范围 -2,147,483,647~2,147,483,647,在Oracle 10g和11g中,BINARY_INTERGER和PLS_INTERGER数据类型是相同的,但是使用PLS_INTERGER效率更高,建议使用PLS_INTERGER;
BOOLEAN:基本逻辑数据类型,只能存储TRUE、FALSE或NULL;
DATE:基本日期和时间型数据类型,取值范围是公元前1471年1月1日到公元9999年12月31日;
其他的子数据类型,后续使用到再做说明。
DECLARE
v_name VARCHAR2(25) := 'TOM';
v_date DATE := SYSDATE + 14; //表示日期SYSDATE的14天后
v_flag BOOLEAN NOT NULL := TRUE;
v_age CONSTANT BINARY_INTERGER := 20;
v_num NUMBER(12,2) := 0;
3.1 数字型数据NUMBER(p,s)
一个简单的程序:
DECLARE
v_num NUMBER(9,2);
BEGIN
v_num := 12345.6789;
DBMS_OUTPUT.PUT_LINE('v_num = ' || v_num);
END;
执行得到
SQL> /
v_num = 12345.68
PL/SQL 过程已成功完成。
SQL>
可以看到保留了两位小数点。
定点数的精度(p)和刻度(s)遵循以下规则:(from Oracle—number数据类型)
- 当一个数的整数部分的长度 > p-s时,Oracle就会报错;
- 当一个数的小数部分的长度 > s 时,Oracle就会舍入;
- 当s为负数时,Oracle就对小数点左边的s个数字进行舍入;
- 当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入。
3.2 %TYPE属性
PL/SQL中的变量主要是用来存储和处理数据库中的数据,如果声明的数据类型和数据库中的数据类型精度有差别,否则程序会出现bug。所以要引入%TYPE属性尽量规避这个问题。
该属性可以按照之前已经声明过的变量或数据库中表的列的数据类型来声明一个变量:
DECLARE
v_num1 NUMBER(5,2) := 3.5;
v_num2 v_num1%TYPE := 5.5;
v_date emp.hiredate%TYPE;
当hiredate列的数据类型变化时,v_date的数据类型相应改变。
数据库列的非空(NOT NULL)约束不适用于%TYPE声明的变量,即使用%TYPE属性声明的变量基于一个定义了非空约束的列,是可以将NULL赋值给这个变量的。该规则不适用于数字和字符类型,NOT NULL属性会传递。
注意:为了获取数据类型,PL/SQL隐含地发出了一个select语句,所以使用该属性具有一定的额外开销。
3.3 布尔变量
布尔变量只有TRUE、FALSE和NULL三个值,可以通过逻辑操作符AND、OR和NOT对变量进行比较并返回一个布尔值。
例程:
DECLARE
tside BOOLEAN := TRUE;
fside BOOLEAN := FALSE;
eside BOOLEAN := NULL;
BEGIN
eside := tside OR fside;
IF eside THEN
DBMS_OUTPUT.PUT_LINE('true' );
else
DBMS_OUTPUT.PUT_LINE('false' );
END IF;
END;
/
运行结果:
SQL> /
true
PL/SQL 过程已成功完成。
SQL>
在列6对bool型变量tside和fside进行或操作并将结果赋值eside,根据eside是否为真打印true或false。
同时还可以使用比较运算符来构造条件表达式:
表达式 operator 表达式
例程:
DECLARE
num1 NUMBER := 10;
num2 NUMBER := 20;
BEGIN
IF num1<num2 THEN
DBMS_OUTPUT.PUT_LINE('num1<num2' );
else
DBMS_OUTPUT.PUT_LINE('num1>num2' );
END IF;
END;
/
运行结果:
SQL> /
num1<num2
PL/SQL 过程已成功完成。
SQL>
PL/SQL提供了以下比较运算符:
4.Q&A
Q:如果字符串中包含了单引号,要怎么处理?
A:使用q’操作符。
举例:
SQL> ED
已写入 file afiedt.buf
1 DECLARE
2 v_day VARCHAR(50);
3 BEGIN
4 v_day := q'!Woman's day!';
5 DBMS_OUTPUT.PUT_LINE('Today is '|| v_day );
6* END;
SQL> /
Today is Woman's day
PL/SQL 过程已成功完成。
SQL>
该程序将q’ 之后的 ! 作为定界符来使用,使用定界符要注意两点:
1.字符串要用两个定界符括起;
2.选定的定界符在字符串中未出现过。
若不想使用q’ ,也可在字符串中的单引号前再插入一个单引号作为逃逸符号(将紧随其后的单引号当做一个普通字符处理),但是这样处理一定程度上会影响阅读,还是推荐使用q’ 。
Q:一般情况下,CHAR型数据与VARCHAR相比哪个更能节约存储资源?
A:VARCHAR,因为VARCHAR是变长字符型数据,字符长度即其占据的空间。