`
sjk2013
  • 浏览: 2176660 次
文章分类
社区版块
存档分类
最新评论

韩顺平玩转oracle之pl/sql听课笔记《三》

 
阅读更多

有些惭愧,距离第2次听课笔记远了。这一讲主要是关于函数,包,还有变量的解释。

1 函数和过程的区别
1)函数:返回特定值,通常是一个;
过程:执行特定操作
2)建立函数时:
在函数头须包含return子句
例如;
return number is
think_salary number(7,2)
在函数体也须包含return语句
return think_salary

2 案例:输入雇员的姓名,返回该雇员的年薪
create function sp_think(spName varchar2)
return number is
yearSal number(7,2);
begin
select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=spName;
return yearSal;
end;
/
在sqlplus中调用:
var think number
call sp_think('SCOTT') into:think
print think

3 包
用于逻辑上组合过程和函数,由包头和包体组成,其中
包头:对过程或函数的声明
包体:实现包头中所声明的过程或函数
案例:
包头:
create package sp_think
is
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
/
包体:
create package body sp_think is
procedure update_sal(name varchar2,newsal number)
is
begin
update emp set sal=newsal where ename=name;
end;
function annual_income(name varchar2)
return number is
annual_salary number;
begin
select sal*12+nvl(comm,0) into annual_salary from emp where ename=name;
return annual_salary;
end;
end;
/

4 如何调用包的过程或函数
调用自己创建的包时:
call sp_think.update_sal('SCOTT',1500);
调用其他方案的包时,如hr:
call hr.sp_think.update_sal('SCOTT',1500);

5 触发器
触发器是自动执行的过程
包含:
1)触发的事件:如DML语句
2)触发的操作:pl/sql块
作用:维护数据库的安全和一致性

6 变量
1)v_ename varchar2(10) -- :=为赋值号,如v_sal number(6,2):=5.8
2)用于存放多值的变量:
2.1) pl/sql记录:同c语言的结构体相似
案例:
declare
type think is record(name emp.ename%type,salary emp.sal%type)--name随ename的变而变
re_think think
begin
select ename,sal into think from emp where empno7788;
dbms_output.put_line('员工名:'||think.name);
end;
2.2)pl/sql表:同c语言的数组相似
案例:
declare
type think is table of emp.ename%type index by binary_integer;
-- 定义了一个pl/sql表类型,存放emp.ename%type,下标是正整数
ta_think think;
....


3) 游标变量:结果集的指针
案例:定义一个pl/sql块,可以输入部门号,显示该部门所有员工的姓名和工资
declare
type think_cursor is ref cursor;
water_cursor think_cursor;
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
open water_cursor for select ename,sal from emp where deptno=&a;
loop
fetch water_cursor into v_ename,v_sal;
exit when water_cursor%notfound;
dbms_output.put_line('名字:'||v_ename||'工资:'||v_sal)
end loop
end;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics