PL/SQL中存储过程int和out的用法
一 介绍
过程和函数中的in和out
(1)一般来讲,过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。
(2)但过程和函数都可以通过out指定一个或多个输出参数。我们可以利用out参数,在过程和函数中实现返回多个值。
二 int和out的使用举例
1.Int输入和out输入和输出一个值
create or replace procedure updateSal(emp_no in number,empsal out number)
as
emp_sal emp.sal%type;
begin
select sal into emp_sal from emp where empno=emp_no;
update emp set sal = emp_sal*1.1 where empno=emp_no;
empsal:=emp_sal;--赋值自动输出
end;
SQL> set serveroutput on;
SQL> declare
2 num number;
3 begin
4 updateSal(7369,num);
5 dbms_output.put_line(num);
6 end;
7 /
800
PL/SQL procedure successfully completed
2.通过empno查询多个值
create or replace procedure selectEmp(emp_no in number, ename out varchar2,job out varchar2 ,sal out number) is
begin
select ename,job,sal into ename,job,sal from emp where empno=emp_no;
end selectEmp;
测试:
SQL> declare
2 ename varchar2(40);
3 job varchar2(40);
4 sal number;
5 begin
6 selectEmp(7369,ename,job,sal);
7 dbms_output.put_line(ename||job||sal);
8 end;
9 /
SMITHCLERK800
3.通过empno查询一个对象的所有属性
create or replace procedure selectemp1(emp_no in number, emp_row out emp%rowtype) is
begin
select * into emp_row from emp where empno=emp_no;
end selectemp1;
测试:
SQL> set serveroutput on;
SQL> declare
2 emp_row emp%rowtype;
3 begin
4 selectemp1(7369,emp_row);
5 dbms_output.put_line(emp_row.ename);
6 end;
7 /
SMITH
4.通过使用光标来获取所有的emp下的
首先用存储过程来调用所有的员工
因为获取的是一个集合,所以要把集合放到一个光标里,放到光标里要建一个包,首先要声明包结构,然后创建包体。
(1) 声明包结构
create or replace package empPackage is
-- 声明需要的类型
type empcursor is ref cursor;
--存储过程的声明 参数中使用了type变量声明的类型
procedure selectEmps(emplist out empcursor);
end empPackage;
--执行之后自动创建包体
(2)创建包体
create or replace package body empPackage is
--包中声明 存储过程的实现 方法的变量必须一致
procedure selectEmps(emplist out empcursor) is
--s声明返回的变量
begin
--为光标赋值
open emplist for select * from emp;
end;
--结束包体
end empPackage;
--注:包体的名称和包的名称一致 emppackage
(2) 测试
SQL> declare
2 empcl empPackage.empcursor;
3 emp_row emp%rowtype;
4 begin
5 empPackage.selectEmps(empcl);
6 loop
7 fetch empcl into emp_row;
8 exit when empcl%notfound;
9 dbms_output.put_line(emp_row.empno);
10 end loop;
11 close empcl;
12 end;
13 /
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
12
13
90
233
PL/SQL procedure successfully completed
用存储函数的方法来调用所有的员工
(1) 声明包结构
create or replace package functionEmps is
--声明类型
type empcl is ref cursor;
function queryEmps return empcl;
end functionEmps;
(2) 创建包体
create or replace package body functionEmps is
function queryEmps return empcl is
emp_cl empcl;
begin
open emp_cl for select * from emp;
return emp_cl;
end;
end functionEmps;
(3)测试
SQL> declare
2 emp_cl functionEmps.empcl;
3 emp_row emp%rowtype;
4 begin
5 emp_cl:=functionEmps.queryEmps;
6 loop
7 fetch emp_cl into emp_row;
8 exit when emp_cl%notfound;
9 dbms_output.put_line(emp_row.empno);
10 end loop;
11 close emp_cl;
12 end;
13 /
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
12
13
90
233
PL/SQL procedure successfully completed
PL/SQL中存储过程int和out的用法
最新推荐文章于 2024-04-20 20:48:37 发布