---- 第三章 变量与数据类型 ----
1. 数据类型
1) 标量型:数字型(BINARY_INTEGER,NUMBER)(DEC,FLOAT,REAL... NUMBER的子类型)、
NUMBER(P,S) P:精度:整个的有效数位(从左边开始第一个不为0的数字起)
S:刻度,可选(小数点后面的保留位数)
BINARY_INTEGER:保存整数. 和NUMBER的底层的保存方式不同,
BINARY_INTEGER为2进制保存,NUMBER 需要考虑其他东西不是2进制方式
BINARY_INTEGER之间做加法效率快而NUMBER要先转换2进制再计算
单纯的计算---->BINARY_INTEGER 考虑和表中其他数据的交互的话一般------->NUMBER
字符型、CHAR VARCHAR VARCHAR2 STRING
LONG
一般CHAR VARCHAR2就够了
CHAR 定长(例子:CHAR(5) 如果不够5个字符的话就会用空白填充 ) ,可以不带长度规定(默认为1)
VARCHAR2 变长((VARCHAR2(5)标识最长可以保存5个字符) 后面的长度规定必须要有
布尔型、BOOLEAN
日期型; DATE(后增加 TIMESTAMP(比DATE更精细点(精确到秒) INTERVAL) 一般用DATE
2) 组合型:RECORD(常用)、TABLE(常用)、VARRAY(较少用)
3) 参考型:REF CURSOR(游标)、REF object_type
4) LOB(Large Object)
2. %TYPE
[变量名] [表名.字段名] [%TYPE]
表示变量具有与数据库的表中某一字段相同的类型
例:v_FirstName s_emp.first_name%TYPE;
3. RECORD类型
TYPE t_emp IS RECORD( /*其中TYPE,IS,RECORD为关键字,record_name为变量名称*/
field1 type [NOT NULL][:=expr1], /*每个等价的成员间用逗号分隔*/
field2 type [NOT NULL][:=expr2], /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/
... /*所有没有初始化的字段都会初始为NULL*/
fieldn type [NOT NULL][:=exprn]
);
4. %ROWTYPE
返回一个基于数据库定义的类型
DECLARE v_emp s_emp%ROWTYPE; /*s_emp为表的名字*/
注:与RECORD类型中定一个record相比,一步就完成,
而RECORD类型中定义分二步:a. 所有的成员变量都要申明; b. 实例化变量;
可以代替RECORD类型.
5. TABLE类型
TYPE tabletype IS TABLE OF type(类型名,要保存成的数据类型) INDEX BY BINARY_INTEGER;
例:
DECLARE
TYPE t_emp IS TABLE OF s_emp%ROWTYPE INDEX BY BINARY_INTERGER;
v_emp t_emp;
BEGIN
SELECT * INTO v_emp(100) FROM s_emp WHERE id = 1;
SELECT * INTO v_emp(200) FROM s_emp WHERE id = 2;
DBMS_OUTPUT.PUT_LINE(v_emp(200).id||' '||v_emp(200).lastname||' '||v_emp(200).salary);
END;
注:1) id(索引) 的数目的限制由BINARY_INTEGER的范围决定(-2147483647<----->2147483647);
2) TABLE类型与map<int,_T>类似;
3) 表中的元素可以是复合类型;
4) KEY 没有必要是顺序的;
5) 当数据被插入表中的时候,表所需的空间就被分配了;
6. 变量的作用域和可见性
1) 执行块里可以嵌入执行块;
2) 里层执行块的变量对外层不可见;
3) 里层执行块对外层执行块变量的修改会影响外层块变量的值
(在此里层,对其他里层则不影响,想要不影响此里层的话可以使用标号标注外层);