表变量不能修改结构另外:
1)表变量是存储在内存中的,当用户在访问表变量的时候,SQL Server是不产生日志的,而在临时表中是产生日志的;
2)在表变量中,是不允许有非聚集索引的;
3)表变量是不允许有DEFAULT默认值,也不允许有约束;
4)临时表上的统计信息是健全而可靠的,但是表变量上的统计信息是不可靠的;
5)临时表中是有锁的机制,而表变量中就没有锁的机制。
标量变量:
标量变量是指只能存放单个数值的变量。当编写pl/sql程序时,最常用的变量就是标量变量。当定义标量变量时,必须要指定标量数据类型。标量数据类型包括数字类型、字符类型、日期类型和布尔类型,每种类型又包含有相应的子类型,例如number 类型包含有integer positive等子类型。
1、常用标量类型
(1)varchar2(n)
该数据类型用于定义可变长度的字符串,其中n用于指定字符串的最大长度,其最大值为32767字节。当使用该数据类型定义变量时,必须要指定长度。需要注意,当在pl/sql块中使用该数据类型操纵varchar2表列时,其数值的长度不应该超过4000字节。
(2)char(n)
该数据类型用于定义固定长度的字符串,其中n用于指定字符串的最大长度,其最大值为32767字节。当使用该数据类型定义变量时,如果没有指定n 则其默认值为1.需要注意,当在pl/sql块中使用该数据类型操纵char表列时,其数值的长度不应该超过2000字节。
(3)number(p.s)
该数据类型用于定义固定长度的整点数和浮点数,其中p表示精度,用于指定数字的总位数;s表示标度,用于指定小数点后的数字位数。例如,假定定义了变量number(6,2),那么整数位属最大应该是4位。
(4)date
该数据类型用于定义日期和实践数据,其数据长度为固定长度(7字节)。但需注意,当给date变量赋值时,数据必须要与日期格式日起语言匹配。
(5)timestamp
该数据类型是oracle9i新增加的数据类型,他也用于定义日期和时间数据。给timestamp变量赋值的方法与给date变量赋值的方法完全相同。但当显示timestamp 变量数据时,不仅会显示日期,而且还会显示时间和上下午标记。
(6)long和long raw
long数据类型用于定义变长字符串,类似于varchar2数据类型,但其字符串的最大长度为32760字节;long raw 数据类型用于定义变长的二进制数据,其数据最大长度为32760字节。
(7)boolean
该数据类型用于定义布尔变量,其变量的值为true ,false 或null 。需要注意,该数据类型是pl/sql数据类型,表列不能采用该数据类型。
(8)binary_integer
该数据类型用于定义整数,其数值范围在-2147483647和2147483647之间。在oracle9i之前,当在pl/sql块中定义pl/sql表时,必须使用该数据类型作为下标的数据类型。需要注意,该数据类型是pl/sql数据类型,表列不能采用该数据类型。
(9)binary_float 和binary_double
binary_float 和binary_double 是oracle 10g新增加的数据类型,分别用于定义单精度的浮点数和双精度的浮点数。这两种数据类型主要用于高速的科学计算,当为binary_float类型的变量赋值时,应该带有后者f(例如1.f);当为binary_double类型的变量赋值时,应该带有后者d(例如3.00085d)。
2 定义标量变量
当编写pl/sql程序时,如果要引用变量变量,必须首先在定义部分定义变量变量,然后才能在执行部分或例外处理部分中使用这些标量变量。
(1)语法
在pl/sql块中定义变量和常量的语法如下:
identifier [constant] datatype {not null } {:= | default expr}
identifer 用于指定变量或常量的名称。改变。
datatype:用于指定变量或常量的数据类型。
not null :用于强制初始化(不能为null)。当指定你not null 选项时,必须要为变量提供数值。
:=:用于为变量和常量指定初始值。
default:用于为变量和常量指定初始值。
expr:用于指定初始值的pl/sql表达式,可以是文本值、其他变量、函数等。
(2)定义标量变量示例
当定义标量变量时,必须要使用标量数据类型。示例如下:
v_ename varchar2(10);
v_sal number(6,2)
v_balance binary_float; oracle 10g 新数据类型
v_tax_rate constant number(3,2) :=5.5;
v_hiredate date
v_valid boolean not null defaule false;
如例所示,以上语句定义了五个变量(v_ename,v_sal ,v_balance,v_hiredate,v_valid)
和一个常量(c_tax_rate),并且为变量v_valid 提供了初始值。需要注意,如果在定义变量时没有制定初始值,那么变量初始值为null.
3 使用标量变量
当在定义部分定义了标量变量之后,在执行部分和例外处理部分可以引用这些标量变量。
需要注意,在pl/sql块中为变量赋值不同其它编程语言,必须要在等号前加冒号(:=)。
下面以输入雇员号显示雇员姓名、工资、个人所得税为例,说明在pl/sql块中使用标量变量的方法如下:
set serverout on
declare
v_ename varchar2(5);
v_sal number(6,2);
c_tax_rate constant number(3,2) :=0.03;
v_tax_sal number(6,2);
begin
select ename ,sal into v_ename,v_sal from emp where deptno=&eno;
v_tax_sal :=v_sal*c_tax_rate;
dbms_output.put_line('雇员名:' ||v_ename);
dbms_output.put_line('雇员工资:'||v_sal);
dbms_output.put_line('所得税:'||v_tax_sal);
end;
/
输入 eno 的值: 7788
原值 7: select ename,sal into v_ename,v_sal from emp where empno=&eno;
新值 7: select ename,sal into v_ename,v_sal from emp where empno=7788;
雇员名:SCOTT
雇员工资:2000
所得税:60
PL/SQL 过程已成功完成。