《PL/SQL 语言开发参考手册》之三:变量与数据类型

​《PL/SQL 语言开发参考手册》下载地址​​        1、数据类型                1)标量型
                        数字型(BINARY_INTEGER,NUMBER)(DEC,FLOAT,REAL... NUMBER 的子类型);
                                NUMBER(P,S) P:精度,整个的有效数位(从左边开始第一个不为 0 的数字起);S:刻度,可选(小数点后面的保留位数)
                                BINARY_INTEGER:保存整数,和 NUMBER 的底层的保存方式不同,BINARY_INTEGER 为二进制保存,NUMBER 需要考虑其他东西不是二进制方式;BINARY_INTEGER 之间做加法效率快,而 NUMBER 要先转换二进制再计算;单纯的计算选择使用 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、变量的作用域和可见性    <<outer>>                1)执行块里可以嵌入执行块;
                2)里层执行块的变量对外层不可见;
                3)里层执行块对外层执行块变量的修改会影响外层块变量的值(在此里层,对其他里层则不影响,想要不影响此里层的话可以使用标号标注外层);