在编写pl/sql块时,可以定义变量和常量;在pl/sql程序中包括有:
1、标量类型(scalar)
2、复合类型(composite)
3、参照类型(reference)
4、lob(large object)
标量(scalar)-常用类型
定义语法:
定义一个字符串:v_name varchar2(20);
定义一个小数:v_sal number(6,2);
定义一个小数并给一个初始值:v_sal number(6,2) :=4.5;
定义一个日期类型:v_date date;
定义一个布尔类型,不能为空,初始值为false :v_valid boolean not null default false;
使用变量:
输入员工号,显示雇员姓名,密码,及密码*12;
declare
v_num number(2):=12;
v_name varchar2(20);
v_mim caozyxx.mim%type;
v_nianx number(20);
begin
select caozyxm,mim into v_name,v_mim from caozyxx where caozydm = &v_id;
v_nianx := v_mim * v_num;
dbms_output.put_line('姓名:'||v_name||'密码:'||v_mim||'年薪:'||v_nianx);
end;
在上面的这个案例中,我们直接定义了v_mim为number(5),但是如果我们使用的表中的对应列如果超过5了呢,这样就能用到**%type类型**直接定义相对应的列的相同类型来解决:
v_mim caozyxx.mim%type;
--v_mim的类型大小就与caozyxx.mim列的类型大小一致;
复合变量(composite):
用于存放多个值的变量
1、pl/sql记录
创建一个记录包,将定义的一系列内容放在该包内,并在最后用一个变量保存该记录包;
也可以把他看做我们自己定义的类型
declare
--定义一个pl/sql记录类型,类型名为a
type a is record(
--在类型a中定义变量;
v_name varchar2(20),
v_mim caozyxx.mim%type,
);
--这个类型a可以存放两个数据
--定义了一个b变量,这个变量类型是a类型;
b a;
v_num number(20):=12;
v_nianx number(38);
begin
--将查询的数据直接放到变量b中,因为b能存放2个类型;
select caozyxm,mim into b from caozyxx where caozydm = &0;
v_nianx := b.v_mim * v_num;
dbms_output.put_line('姓名:'||b.v_name||'密码:'||b.v_mim||'年薪:'||v_nianx);
end;
--注意的是,该包内有多少变量,在执行部分中一定要传过来多少值;既caozyxm,mim....要与该记录包中定义的v_name,v_mim... 一致,定义的有多少,查询的列就要有多少,顺序也要相同;
2、pl/sql表
相当于高级语言中的数组,但该pl/sql表下标是可以为负数的,并且表元素的下标没有限制;
示例:
declare
--定义一个pl/sql表类型sp_table_type,用来存放caozyxx.caozyxm这个类型的数据
--index by binary_integer 代表下标是整数;
type sp_table_type is table of caozyxx.caozyxm%type index by binary_integer;
--定义sp_table这个变量,这个变量的类型是sp_table_type
sp_table sp_table_type;
begin
select caozyxm into sp_table(-1) from caozyxx where caozydm = '0000';
dbms_output.put_line('姓名:'||sp_table(-1));
end;
根据以上问题,如果要存错多个数据怎么办?既如果把where子句去掉的话,这个时候要用到参照变量;
参照变量
参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享形同对象,从而降低占用的空间。在编写pl/sql程序时,可以使用**游标变量(ref cursor)和对象类型变量(ref obj_type)**两种参照变量类型;
游标变量:既游标
使用游标时,当定义游标时不需要指定相应的select语句,但是当使用游标时(open)需要指定select 语句,这样一个游标就与一个select语句结合;
实例:
使用pl/sql块,输入部门号,显示该部门所有的员工姓名,和他的工资。
declare
--定义游标类型
type sp_cursor is ref cursor;
--定义一个游标变量;
aa sp_cursor;
--定义变量
v_name caozyxx.caozyxm%type;
v_mim caozyxx.mim%type;
begin
--执行
--把aa和一个select结合;
--打开游标
open aa for select caozyxm,mim from caozyxx where qiy = 1;
--循环取出
loop
fetch aa into v_name,v_mim;
--判断aa是否为空
exit when aa%notfound;
dbms_output.put_line('姓名:'||v_name||'薪水:'||v_mim);
end loop;
end;