PL_SQL模块学习之六、数据类型

数据类型

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
发布了86 篇原创文章 · 获赞 23 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_32392597/article/details/104677473