指存储在数据库中供所有用户程序调用的子程序叫存储过程/存储函数。
存储过程和存储函数的相同点:完成特定功能的程序
存储过程和存储函数的区别:是否用return语句返回值
用CREATE PROCEDURE命令建立存储过程和存储函数。
语法:
create [or replace] PROCEDURE 过程名(参数列表)
AS
PLSQL子程序体;
打印:Hello World
--第一个存储过程:打印Hello World
/*
调用存储过程:
1.exec sayhelloworld() ;
2.begin
sayhelloworld() ;
sayhelloworld() ;
end;
*/
create or replace procedure sayhelloworld
as
--说明部分
begin
dbms_output.put_line('Hello World');
end;
/
使用exec语句
使用PL/SQL程序
举例:为指定的员工,涨100块钱的工资;并且打印涨之前和涨之后的薪水。
--创建一个带参数的存储过程
--给指定的员工涨100块钱的工资,并且打印涨前和涨后的薪水
create or replace procedure raisesalary (eno in number)
as
psal emp.sal%type;
begin
--得到员工涨前的薪水
select sal into psal from emp where empno = eno;
--给该员工涨100
update emp set sal = sal + 100 where empno = eno;
--打印
dbms_ output.put_ line('涨前: '||psal||' 涨后: '||(psal + 100));
end;
/
--调用存储过程
begin
raisesalary( 7839) ;
raisesalary( 7566) ;
commit;
end;
/
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE
(
host => '192.168.128.1',
lower_port => null,
upper_port => null,
ace => xs$ace_type(privilege_list => xs$name_list('HYHCJ'),
principal_name => 'c##scott',
principal_type => xs_acl.ptype_db)
);
END;
函数(Function)为一命名的存储程序,可带参数,并返回一计算机值。
函数和过程的结构类似,但必须有一return子句,用于返回函数值。
create [or replace] FUNCTION 函数名(参数列表)
return 函数值类型
AS
PLSQL子程序体;
查询某个员工的年收入
--存储函数:查询某个员工的年收入
create or replace function query empincome (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;
--直接返回年收入
return psal*12+nvl(pcomm,0);
end;
/
一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值。
过程和函数都可以通过out指定一个或多个输出参数。我们可以利用out参数,在过程和函数中实现返回多个值。
--out函数: 查询某个员工姓名月薪和职位
create or replace procedure queryempinform(eno in number,
pename out varchar2,
psal out number ,
empjob out varchar2)
as
begin
--得到该员工的姓名月薪和职位
select ename, sal, empjob into pename, psal, emppjob from emp where empno = eno;
end;
/
访问存储过程
访问存储函数
参考:https://blog.csdn.net/hyh17808770899/article/details/106872076
案例:查询某个部门中所有员工的所有信息
包头:
create or replace package mypackage as
type empcursor is ref cursor;
procedure queryEmpList (dno in number, 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;
注意:需要带上包名