1.概念:存储过程就是一段存储数据库中执行某种功能的PL/SQL程序
跟java中的方法相类似,而且都需要调用
过程是一个命名的程序块,这种有名字的PL/SQL块称之为存储程序单元或子程序,是被存储数据库中的。
其中,子程序分为4种:存储过程、函数、包和触发器
过程主要的操作是:增删改查
2.创建存储过程的基本语法:
create [or replace] procedure [<方案名>.]<存储过程名>
[ ( <参数1>[ In | Out | In Out ]<数据类型>[,…] ) ]
Is | As
[<内部变量1><内部变量的数据类型>[,…] ]
Begin
<存储过程体>
End [<存储过程名>]

create or replace procedure say is
begin
    dbms_output.put_line('hello');
end;

3.调用存储过程

exec 存储过程名();  --第1种
call 存储过程名();  --第2种
begin  --第3种
  存储过程名();	
end;

4.输入参数 in、输出参数 out(过程变量前面可以加p_与其他变量进行区分)
(1) in:表示参数是输入给过程的,在一开始就是要有值的
带in参数的过程的调用,in在输入的时候可以省略,默认为输入参数
①按位置调用
exec raisesal(7369);
②按名称调用
在调用存储过程的参数列表中不仅提供参数名,还指定给它传递的参数值两部分。
exec raisesal(eno=>7369)
可以设置参数的默认值,如果调用时不指定值,则为默认值

create or replace procedure alen(eno emp.empno%type default 7521)--这样写也可:eno in emp.empno%type:=7521
is
p_sal emp.sal%type;--只能写变量类型,不能写精度
begin
  select sal into p_sal from emp where empno=eno;
  update emp set sal=sal+100 where empno=eno;
  dbms_output.put_line('涨钱前'||p_sal||',涨钱后'||(p_sal+100));--一定要加(),不能省略
end;
exec alen(7521);

(2) out:表示参数在过程中将被赋值,可以传给过程体的外部,相当于变量,一开始是没有值的,是在过程中被赋予的值
①如果有输出参数的话,一般要在匿名块中调用,这样更加方便
在匿名块中把in参数和out参数都设置为变量,然后输出out参数变量

create or replace procedure show(eno emp.empno%type,p_name out emp.ename%type,p_sal out emp.empno%type)
is
begin
  select ename,sal into p_name,p_sal from emp where empno=eno;
  exception
  when no_data_found then
    dbms_output.put_line('无该数据');
end;

--如果有输出的话,用匿名块输出方便
declare
  eno emp.empno%type;
  v_name emp.ename%type;
  v_sal  emp.empno%type;
begin
  show(p_name=>v_name,p_sal=>v_sal,eno=>7521);--按照名字赋值
  --按照位置赋值:show(7521,v_name,v_sal);
  dbms_output.put_line(v_name||' '||v_sal);
end;

②在命令窗口通过绑定变量调用
在这里插入图片描述

--要在命令窗口中写代码!!
var v_name varchar2(10); --不能用字段类型%type与%rowtype
var v_sal number; --number类型不能加长度
exec show(7369,:v_name,:v_sal); --变量绑定,调用存储过程
print v_name v_sal;
select :v_name,:v_sal from dual;

(3)输入输出参数 in out

--数据交换:输入输出参数
create or replace procedure swap(n1 in out number,n2 in out number)--in out不可省略
is
p_temp number;--变量,常量声明
begin
  p_temp:=n1;
  n1:=n2;
  n2:=p_temp;
end;

--匿名块调用存储过程
declare
  num1 number:=&first;
  num2 number:=&second;
begin
  dbms_output.put_line('num1='||num1||',num2='||num2);
  swap(num1,num2);
  dbms_output.put_line('num1='||num1||',num2='||num2);
end;

5.查看存储过程

--user_objects显示有关对象的信息
select object_name,object_type,status from user_objects where object_name='SHOW';

--user_source显示源代码文本。
select line,text from user_source where name='SHOW';
-- 使用游标 和 loop 循环来显示所有部门的名称
declare
  cursor myc is select deptno from dept;
  v_dname dept.dname%type;
begin
  open myc;
  loop
      fetch myc into v_dname;
    exit when myc %notfound;
      dbms_output.put_line(v_dname);
  end loop;
  close myc;
end;

-- 写一个函数 输入一个员工名字,判断该名字在员工表中是否存在。存在返回 1,不存在返回 0
create or replace function pd return number
is
  v_ename emp.ename%type:='&aa';
  n number;
begin
  select count(*) into n from emp where ename=v_ename;
  if n=0 then return 0;
  else return 1;
  end if;
end;
-- 编写一个过程,要求,可以传入部门的编号,部门的名称,之后调用此过程就可以完成部门的增加操作。
create or replace procedure pdu(dna dept.deptno%type,den dept.dname%type)
is
begin
  insert into dept(deptno,dname) values(dna,den);
end;
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐