存储过程和函数
概述:
ORACLE 提供 可以把PL/SQL 程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。存储过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。
存储过程
存储过程,就是一段存储在数据库中执行某块业务功能的程序模块。它是由一段或者多段的PL/SQL代码块或者SQL语句组成的一系列代码块。
--创建存储过程的语法
create or replace procedure 存储过程名字 [(参数 in| out|in out 参数的数据类型)]
as | is
声明部分:
begin
plsql代码块
exception
异常处理
end;
-- 无参数存储过程
create or replace procedure p1
is
cursor cur_emp is select * from emp;
begin
for v_emp in cur_emp loop
dbms_output.put_line(v_emp.ename);
end loop;
end;
/*
如果使用/调用存储过程
*/
-- 1、在plsql块中调用
begin
p1;-- p1();
end;
-- 2、call 命令调用
call p1();
-- 3、 execute 命令调用 (属于sqlplus命令) 需要通过cmd小黑窗执行 记得 set serverout on
execute p1();
/*
查询存储过程 user
select * from user_objects --数据字典
*/
/*
删除存储过程
drop procedure 存储过程的名字;
*/
drop procedure p1;
/*
参数的三种模式
IN 用于接受调用程序的值。默认的参数模式
OUT 用于向调用程序返回值
IN OUT 用于接受调用程序的值,并向调用程序返回更新的值
*/
-- IN 用于接受调用程序的值。默认的参数模式
--写一个存储过程,根据传入部门编号,查询该部门下的所有员工,并打印员工信息
create or replace procedure p2(v_deptno in number)-- 这里的数据类型不需要加长度,这里in可以省略,默认为in
is
begin
for v_emp in (select * from emp where deptno = v_deptno) loop
dbms_output.put_line(v_emp.empno||','||v_emp.ename);
end loop;
end;
-- 使用
begin
p2(10);
end;
begin
p2(v_deptno => 10);
end;
declare
v number :=20;
begin
p2(v);
end;
create or replace procedure p2_2(v_deptno1 in number,v_deptno2 in number)
is
begin
dbms_output.put_line(v_deptno1||','||v_deptno1);
end;
begin
p2_2(10,20);
end;
begin
p2(v_deptno2 => 10,v_deptno1 => 20);-- 顺序可以打乱
end;
declare
v1 number :=20;
v2 number :=20;
begin
p2_2(v1,v2);
end;
-- OUT 用于向调用程序返回值
--根据传入的员工编号,查询出员工信息并以输出参数的方式返回
create or replace procedure p3(v_empno in emp.empno%type,v_emp out emp%rowtype)
is
begin
select * into v_emp from emp where empno = v_empno;
end;
-- 使用
declare
v_e emp%rowtype;
begin
p3(7369,v_e);
dbms_output.put_line(v_e.empno||','||v_e.ename);
end;
--IN OUT 用于接受调用程序的值,并向调用程序返回更新的值
--根据传入的员工编号,查询出员工信息并以输出参数的方式返回
create or replace procedure p4(v_emp in out emp%rowtype)
is
begin
select * into v_emp from emp where empno = v_emp.empno;
end;
-- 使用
declare
v_e emp%rowtype;
begin
v_e.empno := 7369;
p4(v_e);
dbms_output.put_line(v_e.empno||','||v_e.ename);
end;
-- 其他用户调用scott用户的存储过程
-- 创建用户
create user test6 identified by root;
grant connect,resource to test6;
-- 使用test6登录
begin
scott.p1();
end;
-- 不能访问
-- 使用 scott用户授权才可以
grant execute on p1 to test1;
函数
函数是通过关键字function按照自己的需求把复杂的业务逻辑封装进PL/SQL函数中,函数提供一个返回值,返回给使用者。
--创建函数的语法
create [or replace] function 函数名称[(形式参数 参数类型,...)]
return 返回值类型
is
声名变量;
begin
plsql代码块;
return 返回值;--return后面的内容不执行
end;
-- 无参数的函数
create or replace function f1
return varchar2
is
begin
return '我爱你';
end;
-- 查看函数
select * from user_objects where object_ type = 'FUNCTION';
-- 使用函数,调用函数
1、用在sql语句中
select f1 from dual;
select f1 from emp;
select * from emp where f1()='我爱你';
2、在plsql块中使用
begin
dbms_output.put_line(f1);
end;
-- 删除函数
-- drop function 函数名
drop function f1;
-- 有参数的函数
-- 编写函数,接受一个数,返回1-这个数的和。
create or replace function f2(n number)
return number
is
v_sum number:=0;
begin
for i in 1..n loop
v_sum :=v_sum+i;
end loop;
return v_sum;
end;
-- 使用
select f2(3) from dual;
-- 多个函数的写法
-- 编写函数,接受2个值,返回最大值
create or replace function f3(n1 number,n2 number)
return number
is
-- v number;
begin
if n1>n2 then
-- v:=n1;
return n1;
else
-- v:=n2;
return n2;
end if;
--return v;
end;
-- 使用
select f3(2,3) from dual;
更多推荐
存储过程和函数——PL/SQL教程(七)
发布评论