文章目录
数据类型
1 CHAR和VARCHAR2
1.1 VARCHAR2
- 存储变长的字符数据类型
- 最大为32767字节
1.2 CHAR
- 存储定长的字符数据类型
- 最大为2000字节
EX:
SQL> run
1 declare
2 var_char1 char;
3 var_char2 char(20);
4 begin
5 var_char1 := 'a';
6 var_char2 := 'abc';
7 dbms_output.put_line ('var_char1 is : '||var_char1||'*');
8 dbms_output.put_line ('var_char2 is : '||var_char2||'*');
9* end;
var_char1 is : a*
var_char2 is : abc * #被空格填充
PL/SQL procedure successfully completed.
2 NUMBER
- 可存储任何大小的定点和存储
- 语法格式:number(precision,scale)
precision:精度最大值为38个十进制位
scale:数值范围为0~127,为负时可对数值进行四舍五入
EX:
SQL> declare
2 var_num1 number(5,2);#
3 var_num2 number(4,-3);
4 var_num3 number;
5 begin
6 var_num1 := 123.567;
7 var_num2 := 4563.5;
8 var_num3 := 1234.567;
9 dbms_output.put_line('var_num1 : '||var_num1);
10 dbms_output.put_line('var_num2 : '||var_num2);
11 dbms_output.put_line('var_num3 : '||var_num3);
12 end;
13 /
var_num1 : 123.57
var_num2 : 5000
var_num3 : 1234.567
PL/SQL procedure successfully completed
3 LONG和LONGRAW
3.1 LONG
- 可存储变长字符串
- 最大长度为2G
- 可存储文本、字符组以及各种文档
- 可SELECT/UPDATE/INSERT,无法在表达式、函数以及WHERE/GROUP BY中引用
3.2 LONGRAW
- 存储原始的二进制变量数据
- 最大值为2GB
- 存储时需先用Oracle的包读取并转换为二进制,读取时相反,不可直接查询或操作
4 BOOLEAN
- 用于存储TURE/FALSE/NULL
TRUE 布尔真值
FALSE 布尔假值
NULL 值未知 - 只能赋值以上三个值,且SQL没有对应的数据类型
EX:
SQL> create table t (id number,name varchar2(20),b boolean);
create table t (id number,name varchar2(20),b boolean)
ORA-00902: 无效数据类型
5 PLS_INTEGER
- 带符号的整数数据类型
- 存储空间小,计算快速
EX:
对于NUMBER和PLS_INTEGER两个类型变量执行相同次数计算,比较执行时间
SQL> declare
2 var_num number :=1;
3 var_plsinteger pls_integer :=1;
4 var_start number;
5 var_end number;
6 begin
7 var_start :=DBMS_UTILITY.get_time;#执行开始时间
8 for i in .60000000 loop
9 var_num := var_num+1;
10 end loop;
11 var_end := DBMS_UTILITY.get_time;#执行结束时间
12 DBMS_OUTPUT.PUT_LINE('number type '||(var_end-var_start));#相减得出计算时间
13 var_start :=DBMS_UTILITY.get_time;
14 for i in .60000000 loop
15 var_plsinteger := var_plsinteger+1;
16 end loop;
17 var_end :=DBMS_UTILITY.get_time;
18 dbms_output.put_line('plsinteger type'||(var_end-var_start));
19 end;
20 /
SQL>
number type 400
plsinteger type182
PL/SQL procedure successfully completed
- 存在溢出问题
ORA-01425:numberic overflow
对溢出变量定义INTEGER数据类型(NUMBER) - SIMPLE_INTEGER 其子类型,具有非空约束,定义时必须赋予初始值
6 DATE和TIMESTAMP
6.1 DATE
- 存储定长的日期值
- 默认值当月第一天零时
- 保存的日期格式为 yyyy-mm-dd hh24:mi:ss
- 默认输出格式为 yyyy-mm-dd
EX:
SQL> declare
2 var_date1 date;
3 var_date2 varchar2(20);
4 begin
5 select sysdate into var_date1 from dual;
6 dbms_output.put_line('var_date1 is :'||var_date1);
7 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')into var_date2 from dual;
8 dbms_output.put_line('var_date2 is :'||var_date2);
9 end;
10 /
var_date1 is :05-3月 -20
var_date2 is :2020-03-05 13:00:02
PL/SQL procedure successfully completed
6.2 TIMESTAMP
- 保存的时间会带上毫秒
- TIMESTAMP WITH TIME ZONE:在 timestamp 的基础上加上时区信息
- TIMESTAMP WITH LOCAL TIME ZONE:不保存时区信息,在保存到数据库时,会将时间转换成数据库时区(dbtimezone)对应的时间保存到数据库中,读取的时候会按照会话时区(sessiontimezone
)转换成对应的时间
参考《oracle中的timestamp格式简介》
EX:
SQL>
SQL> declare
2 tme date;
3 tmestp timestamp;
4 tmestp_tz timestamp with time zone;
5 tmpstp_tzl timestamp with local time zone;
6 begin
7 select sysdate into tme from dual;
8 dbms_output.put_line('tme :' ||tme);
9 select sysdate into tmestp from dual;
10 dbms_output.put_line('tmestp :' ||tmestp );
11 select sysdate into tmestp_tz from dual;
12 dbms_output.put_line('tmestp_tz:' ||tmestp_tz);
13 select sysdate into tmpstp_tzl from dual;
14 dbms_output.put_line('tmpstp_tzl:' ||tmpstp_tzl);
15 end;
16 /
tme :05-3月 -20
tmestp :05-3月 -20 02.21000000 下午
tmestp_tz:05-3月 -20 02.21000000 下午 +08:00
tmpstp_tzl:05-3月 -20 02.21000000 下午
PL/SQL procedure successfully completed
7 ANCHORED
- 语法格式:变量名 对象类型属性%TYPE
- 基于底层的数据库对象
- 随着数据对象中数据类型变化而相应变换
EX:
SQL> declare
2 var_name emp.ename%type;#定义与emp表的ename数据类型相同
3 var_salary emp.sal%type;#定义与emp表的sal数据类型相同
4 begin
5 select ename,sal into var_name,var_salary
6 from emp where empno =7654;
7 dbms_output.put_line('var_name is :'||var_name);
8 dbms_output.put_line('var_salary is :'||var_salary);
9 end;
10 /
var_name is :MARTIN
var_salary is :1250
PL/SQL procedure successfully completed
8 自定义数据类型
8.1 无约束的用户定义子类型
- 即基类型的别名
- 定义语法: SUBTYPE 子类型名称 IS 基类型
- 需要在DECLARE部分声明
- 与基类型之间可互换使用,但不会发生数据类型转换
EX:
SQL> declare
2 subtype mynumber is number;
3 var_num1 mynumber(6,2) :=100;
4 var_num2 mynumber(8,2) :=200;
5 var_num3 mynumber(8,2) :=300;
6 subtype mynatural is natural;
7 var_nat1 mynatural :=1;
8 var_nat2 mynatural :=2;
9 var_nat3 mynatural :=3;
10 begin
11 var_num1 := var_num1+var_nat1;
12 var_num2 := var_num2+var_nat2;
13 var_num3 := var_num3+var_nat3;
14 dbms_output.put_line('var_num1 :'||to_char(var_num1));
15 dbms_output.put_line('var_num2 :'||to_char(var_num2));
16 dbms_output.put_line('var_num3 :'||to_char(var_num3));
17 end;
18 /
var_num1 :101
var_num2 :202
var_num3 :303
PL/SQL procedure successfully completed
8.2 有约束的用户定义子类型
- 需要通过基类型定义
- 定义时已给出数据类型范围、非空约束
- 定义语法:
SUBTYPE subtype_name IS base_type { precision [,scale] | RANGE low_value .. high_value } [NOT NULL]
SQL> DECLARE
2 SUBTYPE UNDER10 IS PLS_INTEGER RANGE 0..9;#定义取值范围为0~9
3 SUBTYPE BETWEEN1099 IS PLS_INTEGER RANGE 10..99;#定义取值范围为10~99
4 SUBTYPE Under100 IS PLS_INTEGER RANGE 0..99;#定义取值范围为0~99
5 d10 UNDER10 :=4;
6 d1099 BETWEEN1099 :=35;
7 u100 Under100;
8 BEGIN
9 u100 := d10;#u100为4时符合Under100的0~99取值范围
10 u100 := d1099;#u100为35时符合Under100的0~99取值范围
11 d1099 := d10;#d1099为4时不符合BETWEEN1099的10~99取值范围,所以报错
12 END;
13 /
ORA-06502: PL/SQL: 数字或值错误
ORA-06512: 在 line 11