---- 第三章 变量与数据类型 ----

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) 里层执行块对外层执行块变量的修改会影响外层块变量的值
  (在此里层,对其他里层则不影响,想要不影响此里层的话可以使用标号标注外层);