一、编写存储过程
1.复用匿名代码块,我们需要使用存储过程,函数,触发器等,存储过程就是封装了一个匿名代码块,可以通过参数进行输入,输出值。
我们可以通过调用有名称的存储过程来复用代码块。
2.格式:
create [or replace] procedure 名称[(参数1 类型,参数2 类型 , ...)]
is|as
--变量声明区间
begin
--业务逻辑区间
end;
/
3.存储过程的调用
(1)直接调用
call 存储过程名(有参传参);
(2)plsql调用
begin
存储过程名(有参传参);
end;
--练习:使用存储过程输出显示helloword
create or replace procedure pro_d
is
begin
dbms_output.put_line('Helloworld');
end;
/
begin
pro_d();
end;
/
--练习:定义一个存储过程输出参数内容
create or replace procedure pro_out(idc number)
is
s number(4):=5;
begin
s:=s+idc;
dbms_output.put_line(s);
end;
/
begin
pro_out(5);
end;
/
--练习,使用存储过程,获取某一员工的编号对应的姓名和职位
create or replace procedure pro_equ(eno number)
is
ena emp.ename%type;
ejob emp.job%type;
begin
select ename,job into ena,ejob from emp where empno=eno;
dbms_output.put_line(ena||'----'||ejob);
end;
/
begin
pro_equ(7369);
end;
/
--练习,传入一个部门编号,查询部门的总工资
create or replace procedure pro_ssal(dno number)
is
s emp.sal%type;
begin
select sum(sal) into s from emp where deptno=dno;
dbms_output.put_line(s);
end;
/
begin
pro_ssal(10);
end;
/
4.存储过程可以使用参数返回数据,特点:此时参数需要一些属性(in |out |in out)。
in表示参数只能传入 不能输出(默认状态下属性为in)
out表示参数只能用于输出
in out 表示参数可以传入传出
格式 :参数名 [in|out|in out] 类型
--练习 :传入两个参数,计算两个数的和与差
create or replace procedure pro_sum(a in number,b in number,s out number)
is
begin
s:=a+b;
end;
/
declare
total number(8);
begin
pro_sum(4,5,total);
dbms_output.put_line(total);
end;
/
--练习:创建一个存储过程,完成临时表的信息存入dept表中,
-- 然后删除临时表数据
drop table dept_bak;
create table dept_bak(
deptno number(4),
dname varchar2(20),
loc varchar2(50)
);
insert into dept_bak values(11,'a','b');
insert into dept_bak values(12,'c','d');
insert into dept_bak values(13,'e','f');
commit;
select * from dept_bak;
--编写存储过程
--使用行变量接收临时表的数据,同时完成对表的数据插入
create or replace procedure pro_copy
is
cursor c is select * from dept_bak;
begin
for rowbak in c loop
insert into dept values(rowbak.deptno,rowbak.dname,rowbak.loc);
end loop;
delete from dept_bak;
commit;
end;
/
begin
pro_copy();
end;
/
--练习:返回a和b的和与差
create or replace procedure pro_com(a in number,b in number,s out number,c out number)
is
begin
s:=a+b;
c:=a-b;
end;
/
set serveroutput on;
declare
s1 number(8);
s2 number(8);
begin
pro_com(8,6,s1,s2);
dbms_output.put_line(s1);
dbms_output.put_line(s2);
end;
/