PL/SQL

来源:互联网 发布:淘宝店铺花呗怎么开通 编辑:程序博客网 时间:2024/06/06 02:14

PL/SQL 中的主要类型:标量,复合变量,参照变量

案例:

--标量的使用
--输入员工编号,显示雇员的姓名、工资、个人所得税(0.03比例)
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_ename varchar2(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;


-------------------------------
--注意:打开输出选项
SET SERVEROUTPUT ON--打开输出选项
----------------------------------

最后的输出结果为:姓名是:SCOTT工资:100缴税:3

-----------------------------------------------------------------------------------------------------------------------------------------


将上面的案例按照如下修改:

v_ename emp.ename%type;--v_ename varchar2(5) 避免溢出(与表emp中ename字段类型相同)
v_sal emp.sal%type;--v_sal number(7,2);
v_tax_sal emp.sal%type;


--------------------------------------------------------------------------------------------------------




案例:

--复合变量
--PL/SQL记录实例
declare
--下面为定义一个PL/SQL记录类型,名字为emp_record_type,包含三个数据,name,salary,title
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;
begin
select ename,sal,job into sp_record from emp where empno=7788;
dbms_output.put_line('员工名:'||sp_record.name||'工资是:'||sp_record.salary);
end;

--------------------------------------------------------------------

最后的输出结果为:员工名:SCOTT工资是:100

--------------------------------------------------------------------


-----------------------------------------------------------------------------------------------------------------------------


案例:

--PL/SQL表实例
declare
--定义了一个PL/SQL表类型,名称为sp_table_type,该类型用于存放emp.ename%type
type sp_table_type is table of emp.ename%type 
  index by binary_integer;--index by binary_integer表示下标是整数
--定一个一个变量sp_table,类型为sp_table_type
sp_table sp_table_type;
begin
select ename into sp_table(0) from emp where empno = 7788;
dbms_output.put_line('员工名:'||sp_table(0));
end;

------------------------------------------------

输出结果为:员工名:SCOTT
------------------------------------------------

--注意:sp_table_type 是PL/SQL的表类型
--emp.ename%type 指定了表的类型和长度
--sp_table(0)表示下标为0的元素 此时返回的数据为一条,若为多条则报错(去掉where empno = 7788)
--这时候要使用参照变量





案例(一):

--参照变量中的游标变量
--使用PL/SQL编写一个块,可以输入部门号,显示所有员工姓名和工资
--案例:
declare
--定义游标类型
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;
--关闭游标
close test_cursor;
end;

------------------------------------------------------------------------
最后输出结果为(输入的部门编号为10):
名字:CLARK工资:2450
名字:KING工资:5000
名字:MILLER工资:1300
-------------------------------------------------------------------------