pl/sql 基础---定义并使用变量!
在编写 pl/sql 程序时,可以定义变量和常量;在pl/sql 程序中包括有:
①标量类型 (scalar)
②复合类型 (composite)
③参照类型 (reference)
④lob (large object)
>标量(scalar)-- 常用类型
在编写 pl/sql 块时,如果要使用变量,需在定义部分定义变量。
pl/sql 中定义变量和常量的语法如下:
标量定义的案例:
①定义一个变长字符串
v_ename varchar2(10);
②定义一个小数范围 -9999.99~9999.99
v_sal number(6,2);
③定义一个小数并给一个初始值为 5.4:= 是 pl/sql 的赋值号
v_sal2 number(6,2):=5.4
④定义一个日期类型的数据
v_hiredate date;
⑤定义一个布尔变量,不能为空,初始值为 false
v_valid boolean not null default false;
>标量:使用标量
在定义好变量后,就可以使用这些变量。这里需要说明的是 pl/sql 块为变量赋值不同于其他的编程语言,需要在等号前加冒号 (:=)
例子:输入员工号,显示雇员姓名,工资,个人所得税(税率为0.03)。
----------------------------------------------
declare
c_tax_rate number(3,2):=0.03;
---用户名
v_ename varchar2(5); ///万一有用户名大于5个字符就会报错了
v_sal number(7,2);
v_tax_sal number(7,2);
begin
---执行
select ename,sal into v_ename,v_sal from emp where empno=&no;
---计算所得税
v_tax_sal:=v_sal*c_tax_rate;
---输出
dbms_output.put_line('姓名是: '||v_ename||' 工资: '||v_sal||' 交税:'||v_tax_sal);
end;
>标量(scalar):使用%type类型
对于上面的 pl/sql 块有一个问题:
就是如果员工姓名超过了5字符的话,就会有错误,为了降低 pl/sql 程序的维护工作量,可以使用 %type 属性定义变量,这样它会按照数据库列来确定你定义的变量的类型和长度。
标识符名 表名.列名%type;
----------------------------------------------
declare
c_tax_rate number(3,2):=0.03;
---用户名
v_ename emp.ename%type; //v_ename,类型是和表emp.ename下面的字段的类型大小一样!
v_sal emp.sal%type;
v_tax_sal number(7,2);
begin
---执行
select ename,sal into v_ename,v_sal from emp where empno=&no;
---计算所得税
v_tax_sal:=v_sal*c_tax_rate;
---输出
dbms_output.put_line('姓名是: '||v_ename||' 工资: '||v_sal||' 交税:'||v_tax_sal);
end;
复合变量(composite)---介绍 []
用于存放多个值的变量。主要包括:
① pl/sql 记录
② pl/sql 表
③ 嵌套表 nested table ///③④再研究!
④ 变长数组 varray ///动态表
》复合类型--pl/sql 记录
类似于高级语言中的结构体,需要注意的是,当引用 pl/sql 记录成员时,必须要加记录变量作为前缀(记录变量.记录成员)如下:
pl/sql 记录实例:
declare
----定义一个 pl/sql 记录类型 emp_record_type [类似于自己定义了一个数据类型,或像一个类,这个类型含三个数据 name, salary, tittle !就是这一个类型,就存放三个数据,便于管理]
type emp_record_type is record(
name emp.ename%type,
salary emp.sal%type,
title emp.job%type);
----定义了一个 sp_record 变量,这个变量的类型是 emp_record_type
sp_record emp_record_type; ---等价: v_name varchar2(45);
begin
select ename,sal,job into sp_record ///一次取出三个数据,扔进sp_record
from emp where empno=7788;
dbms_output.put_line('员工名:'||sp_record.name||’ 工资是:’sp_record.salary);
///用 sp_record.name取!类似面向对象!而不是C的 sp_record->name
end;
/
》复合类型-pl/sql表
相当于高级语言中的数组,但是需要注意的是在高级语言中数组的下标不能为负数,而pl/sql是可以为负数的,并且表元素的下标没有限制,实例如下:
declare
-----定义了一个 pl/sql表类型 sp_table_type,该类型是用于存放 emp.ename%type
-----index by binary_integer 表示下标是整数
type sp_table_type is table of emp.ename%type index by binary_integer;
-----定义了一个 sp_table 变量,这个变量的类型是 sp_table_type
///注意,PL/SQL的习惯是变量写在前面,类型在后面
sp_table sp_table_type;
begin
select ename into sp_table(0) from emp where empno=7788; //没有where,需要参照变量!
dbms_output.put_line('员工名:'||sp_table(0));
end;
/
说明:
sp_table_type 是 pl/sql 表类型
emp.ename%type 指定了表的元素的类型和长度
sp_table 为pl/sql表变量
sp_table(0) 则表示下标为0的元素
问题:能否将 pl/sql记录作为 pl/sql表的类型?
参照变量---介绍
参照变量是指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间。在编写pl/sql程序时,可以使用游标变量(ref cursor)和对象类型变量 (ref obj_type) 两种参照变量类型。
参照变量--ref cursor游标变量
使用游标时,当定义游标时不需要指定相应的 select 语句,但是当使用游标时(open时)需要指定 select 语句,这样一个游标就与一个 select 语句结合了。实例如下:
①请使用 pl/sql 编写一个块,可以输入部门号,并显示该部门所有员工姓名和他的工资。
②在①基础上,如果某个员工的工资低于200元,就增加100元。
①:::::::::::
declare
---定义游标类型 sp_emp_cursor
type sp_emp_cursor is ref cursor;
---定义一个游标变量
test_cursor sp_emp_cursor;
---定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
---执行
---把 test_cursor 和一个 select 结合
open test_cursor for select ename,sal from emp where deptno=&no;
---循环取出
loop
fetch test_cursor into v_ename,v_sal;
---判断是否 test_cursor 为空
exit when test_cursor%notfound;
dbms_output.put_line('名字:'||v_ename||'工资:'||v_sal);
end loop;
end;
/