数据类型:
数字类型:
Number用来表示可变长的数值列,语法为Number(p, s),p是指所有有效数字的位数,s是指小数点以后的位数;p和s的取值分别是p=1 to 38,s=-84 to 127;
有效数位:从左边第一个不为0的数算起,小数点和负号不计入有效位数。
p>0,对s分3种情况:
1. s>0
精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p个0填充。
2. s<0
精确到小数点左边s位,并四舍五入。然后检验有效数位是否<=p+|s|
3.s是0或者未指定,四舍五入到最近整数。
注意:当p小于s时候,表示数字是绝对值小于1的数字,且从小数点右边开始的前s-p 位必须是0,保留s位小数。
比如
Value Datatype Stored Value
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6) 1235
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
0.099996 NUMBER(4,5) <>
用法如下:
create table t_n(id number(5,2));
insert into t_n values(123.455);
insert into t_n values(1.234);
insert into t_n values(.001);
select * from t_n 结果为:
ID |
---|
123.46 |
1.23 |
0.00 |
Number类型存储实数,PLS_Integer和BINARY_Integer只能存储整数。
字符类型:
Char表示定长的字符串,语法Char(L),L是可选的。如果没有指定L值,默认为1;最大长度为32767。
VarChar2用来存储可变的字符串,语法VarChar2(L),L是必须的。最大长度为32767。
布尔类型:
Boolean类型的合法赋值为True、False和Null。
类型转换:
To_Char:可以将Number和Date类型转换为Varchar2类型;
To_Date:将Char类型转换Date类型;
To_Number:将Char类型转换Number类型;
变量和常量:
变量名称:1.必须以字母开头;2.其后可以跟一个或多个字母、数字(0~9)、特殊字符$、#或_ ;
3.变量长度不超过30个字符;4.变量名中不能有空格。
1.变量的声明:
DECLARE
v_StudentName VARCHAR2(20),
v_CurrentDate DATE;
v_NumberCredits NUMBER(3);
2.自定义的数据类型:
DECLARE
TYPE t_StudentRecord IS RECORD (FirstName Varchar2(10),LastName Varchar2(10),
CurrentCredits NUMBER(3));
v_Student t_StudentRecord;
3.变量属性:
下面介绍常见的几种复合数据类型变量的定义。
(1)使用%type定义变量
为了让PL/SQL中变量的类型和数据表中的字段的数据类型一致,Oracle 9i提供了%type定义方法。这样当数据表的字段类型修改后,PL/SQL程序中相应变量的类型也自动修改。如下:
declare
mytable emp.empno%type;
begin
select a.empno into mytable
from emp a
where a.ename='SCOTT';
dbms_output.put_line(mytable);
end;
(2)使用%rowtype定义变量
使用%type可以使变量获得字段的数据类型,使用%rowtype可以使变量获得整个记录的数据类型。
比较两者定义的不同:变量名 数据表.列名%type,变量名 数据表%rowtype。
declare
mytable emp%rowtype;
begin
select * into mytable
from emp a
where a.ename='SCOTT';
dbms_output.put_line(mytable.empno||' '||mytable.job);
end;
流程控制:
待续。。。