利用as替换declare
过程可以有参数,用参数替代 块中让用户在运行时输入的值
create or replace procedure myproc1(eno number)
as
declare
i number;
可执行部分(必需的)
begin
select sal into i from emp where empno=eno;
dbms_output.put_line(i);
异常处理部分(可选的)
exception
when no_data_found then
dbms_output.put_line('没有这个员工!');
end;
实例:接受员工号码按规则给员工增长工资
create or replace procedure upsal(eno number) as
dd number;
ss emp.sal%type;
eee exception;
begin
dd := mydno(eno);
mysal(eno,ss);
--dd=0说明该员工并不存在
**if dd = 0 then
raise eee;
else
if dd = 10 then
if ss * 1.1 > 5000 then
update emp set sal = 5000 where empno = eno;
else
update emp set sal = sal * 1.1 where empno = eno;
end if;
elsif dd = 20 then
if ss * 1.2 > 5000 then
update emp set sal = 5000 where empno = eno;
else
update emp set sal = sal * 1.2 where empno = eno;
end if;
elsif dd = 30 then
if ss * 1.3 > 5000 then
update emp set sal = 5000 where empno = eno;
else
update emp set sal = sal * 1.3 where empno = eno;
end if;
else
null;
end if;
end if;
exception
when eee then
raise_application_error(-20005, '该员工并不存在!');
end;**
调用过程:
create or replace procedure upallsal
as
cursor mycur is select * from emp;
begin
for ee in mycur
loop
upsal(ee.empno);
end loop;
end;
{?= call [(,, ...)]}
{call [(,, ...)]}
执行存储过程:
exec myproc1(7369);
在java应用程序中能接到 数据库 存储过程的返回值
过程的参数分三种: in || out || in out (按地址传递,可进可出)
如何调用函数
declare
p varchar2(20);
begin
p:=myfunc(7777);
dbms_output.put_line(p);
end;
一:返回一个字符类型的值:
create or replace function myfunc(eno number) return varchar2
as
i varchar2(20);
begin
select ename into i from emp where empno=eno;
return i;
exception
when no_data_found then
i:='none';
return i;
end;
二:返回一个数值类型的值:
create or replace function myfun(eno number)
return number
as
i number;
begin
select sal+nvl(comm,0) into i from emp where empno=eno;
return i;
end;
创建包头包体的方式执行
create or replace package mypack
as
type empsurcor is ref cursor;
--如果使用游标变量作为过程的参数,类型必须是in out
procedure queryEmpList(dno in number,rmpList in out empsurcor);
end mypack;
/
--包的主体部分
create or replace package body mypack
as
procedure queryEmpList(dno in number , empList out empcursor)
as
begin
open
empList for select * from emp where deptno=dno;
end;
end mypack;
1、什么是游标?用游标有什么作用?
①从表中检索出结果集,从中每次指向一条记录进行交互的机制。
②关系数据库中的操作是在完整的行集合上执行的。
作用:
①指定结果集中特定行的位置。
②基于当前的结果集位置检索一行或连续的几行。
③在结果集的当前位置修改行中的数据。
④对其他用户所做的数据更改定义不同的敏感性级别。
⑤可以以编程的方式访问数据库。
2 如何制作一个指针指向游标的首行?
open mycur
3 如何通过指针提取当前行的纪录并装入变量?
fetch mycur into eee;
4 如何让指针移动?
通过循环的方式或者条件执行的方式
5 如何关闭并释放游标?
close mycur;
实例:
declare
cursor mycur is select * from emp;
eee emp%rowtype;
begin
open mycur;
fetch mycur into eee;
while mycur%found
loop
dbms_output.put_line(eee.ename||','||eee.job);
fetch mycur into eee;
end loop;
close mycur;
end;
prcedure过程----〉存储过程 没有返回值的函数
function函数----〉有返回值(只能是一个)
存储函数可以与存储过程互换,存储函数可以在存储过程中调用。