oracle:存储过程、函数

oracle:oracle基础知识(三):存储过程、函数笔记,赵强老师

对于视频中涉及java部分的章节省略;


存储过程、存储函数

指存储在数据库中供所有用户过程调用的子程序叫存储过程、存储函数。
共同点:完成特定功能的程序
区别:是否用return 语句返回值

存储过程基本语法
语法:
create procedure命令建立存储过程和存储函数
create [or replace ] procedure 过程名(参数列表)
as
plSQL子程序体;
  • 调用存储过程
/*
调用存储过程
1.execute(exec) sayhelloworld()
2.begin
	sayhelloworld();
end;
/

*/

案例:

create or replace procedure sayhelloworld
as
--说明部分(as 相当于declare)
begin
dbms_output.put_line('hello world');
end;
/

declare 
--定义变量
pnum number;
begin
--迭代标志
pnum:=1;
loop
exit when pnum>10;
--调用存储过程
sayhelloworld();
pnum:=pnum+1;
end loop;
end;
/
  • 案例:带参数的存储过程
    为指定的员工,涨100,并且打印涨前工资和涨后工资
create or replace procedure raiseSalary(eno in number)
as
--定义变量
psal emp.sal%type;

begin
--得到涨前的薪水
select sal into psal from emp where empno=eno;
--涨工资
update emp set sal=sal+100 where empno=eno;
--需不需要commit?
--注意:一般不在存储过程或者存储函数中,commit 和rollback
--打印
dbms_output.put_line('涨前'||psal||'涨后'||(psal+100));

end;
--这里/表示结束符
/

  • 存储过程的调用
/*

--调用:
begin
raisesalary(7369);
raisesalary(7499);
commit;
end;
/
*/

存储函数

--可带参数,并返回计算值(return子句)

语法:
create [or replace ] funcetion(参数列表)
return 函数值类型
as
plsql子程序体;
  • 调用
  • /* 函数调用 begin 函数名() end; select 函数名() from dual; */
    案例:
--案例:查询某一个员工的年收入
create or replace function queryEmpIncome(eno in number)
return number
as
--定义变量保存员工的薪水和奖金
psal emp.sal%type;
pcomm emp.comm%type;
begin
--得到该员工的月薪和奖金
select sal,comm into psal,pcomm from emp where empno=eno;
--直接返回年收入
dbms_output.put_line('员工编号为'||eno||'的奖金'||nvl(pcomm,0)||'年薪'||(psal*12+nvl(pcomm,0)));
return psal*12+nvl(pcomm,0);
end;
/

  • 调用函数
select queryEmpIncome(7369) from dual;

带in 和out 参数

  • -- 存储过程没有返回值 --过程和函数都可以用out指定一个或者多个参数 两者都可以有out参数;可以有多个out参数; 可以通过out参数来实现返回值; 原则:如果只有一个返回值,用存储函数; 否则,用存储过程。

  • 调用

  • 案例


--案例查询某个员工的姓名、月薪、和职位;
create or replace procedure queryempinform(eno in number,
										pename out varchar2,
										psal out number,
										pjob out varchar2)
as
begin 
--得到该员工的姓名、月薪和职位
select ename,sal,job into pename,psal,pjob from emp where empno=eno;
dbms_output.put_line('员工姓名'||pename||'月薪'||psal||'职位'||pjob);
end;
/

  • 调用存储过程
declare
	pename varchar2(10);
	psal number;
	pjob varchar2(10);
begin
queryempinform(7369,pename,psal,pjob);
end;
/
  • 在out参数中使用光标;
    主要用于解决以下问题:
/*
思考:
1.查询员工的所有信息--->out参数太多?
2.查询某个部门中所有员工的所有信息-->out中返回集合?
*/
  • 申明包结构-->包头-->包体

  • 案例:查询某个部门所有员工的信息;

-- 包头:
create or replace package mypackage as
--ref cursor 引用光标类型
type empCursor is ref cursor;
procedure queryEmpList(dno in numbeer,empList out empCursor);
end mypackage;

-- 包体:
--需要实现包头中声明的所有方法
create or replace package body mypackage as
procedure queryEmpList(dno in number,empList out empCursor) as
	begin
		--打开光标,并指明它属于哪一个集合
		open empList for select * from emp where deptno=dno;
	end queryEmpList;
end mypackage;
  • 查看包
-使用desc查看程序包的结构
desc mypackage
--清屏
host cls

-在应用程序中访问包
暂时未考虑

posted @ 2020-04-03 16:59  LgRun  阅读(138)  评论(0编辑  收藏  举报