PL/SQL中存储过程int和out的用法
来源:互联网 发布:送外卖的软件 编辑:程序博客网 时间:2024/06/05 03:41
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 / 800PL/SQL procedure successfully completed2.通过empno查询多个值create or replace procedure selectEmp(emp_no in number, ename out varchar2,job out varchar2 ,sal out number) isbegin 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 / SMITHCLERK8003.通过empno查询一个对象的所有属性create or replace procedure selectemp1(emp_no in number, emp_row out emp%rowtype) isbegin 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 / 73697499752175667654769877827788783978447876790079027934121390233 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 isfunction 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 / 73697499752175667654769877827788783978447876790079027934121390233 PL/SQL procedure successfully completed