存储过程与存储函数

一、存储过程和存储函数:指在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。

       相同点:完成特定功能的程序;

       区别:是否用return语句返回值。

二、创建和使用存储过程

       用CREATE  PROCEDURE命令创建存储过程和存储函数。

       语法:

       create or replace procedure 过程名(参数列表)

       AS

       PLSQL子程序体;

       PL/SQL Developer中用dbms_output.put_line输出前需要执行命令set serveroutput on  可以通过键盘手动输入

       命令窗口执行

扫描二维码关注公众号,回复: 1493733 查看本文章
create or replace procedure sayhelloword

AS

begin

  dbms_output.put_line('Hello World');

end;

     先点击【添加调试信息】,再点击测试

     打开测试窗口开始调试:

     

      在DBMS中会有输出打印信息

      cmd连接oracle

     

    调用写好的存储过程,两种方法:

    1)exec  存储过程名字();

     2)使用PL/SQL程序

              begin

                      存储过程名字();

               End;

              /结束

     

--创建一个带参数的存储过程:
--给指定的员工涨100块钱的工资,并且打印涨前和涨后的薪水
create or replace procedure raisesalary(eno in number)
as 
--定义一个变量存储涨前的新书
 psal emp.sal%type;
begin
 --得到员工涨前的薪水  
--就是指psal这个变量是引用了表emp中的sal字段的类型。如果emp表中sal的类型变了,psal这个字段的类型也会跟着变化,
总之,psal和表emp中sal字段类型一致。引用型变量可以不用知道该表中类型是什么,只要引用的表中的字段类型改变,定义的变量就跟着改变,
用引用型变量易于维护。
select sal into psal from emp where empno = eno; --给员工涨工资100 update emp set sal=sal+100 where empno = eno; --需不需要commit? --注意:一般不再存储过程或者存储函数中,commit或者rollback; --打印 dbms_output.put_line('涨前:'||psal||' 涨后:'||(psal+100));

  end;

  

   打印出信息:涨前:1000 涨后:1100

   

三、存储函数

      函数(Function)为一个命名的存储程序,可带参数,并返回一个计算值。函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。

      创建函数的语法

           create[or replace] functiion 函数名(参数列表) 

           return函数值类型

           as

           PLSQL子程序体;

--查询某个员工的年收入
create or replace function queryempincome(eno in number)
return number
as
  --月薪和奖金
  psal   emp.sal%type;
  pcomm  emp.comm%type;
begin
  select sal,comm into psal,pcomm from emp where empno=eno;
  --返回年收入
  return psal*12+nvl(pcomm,0);
end;
/

    In 和 out参数

    1一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值,而存储过程没有返回值。

    2过程和函数都可以通过out指定一个或多个输出参数。我们可以利用out参数,在过程和函数中实现返回多个值。

   什么时候用存储过程或存储函数?

   原则:如果只有一个返回值,用存储函数;否则,就用存储过程。

   - -out参数:查询某个员工姓名,月薪,职位

  

create or replace procedure queryEmpInfo(eno in number,
                                         pname out varchar2,
                                         psal  out number,
                                         pjob  out varchar2)
as 
begin
  select ename,sal,empjob into pname,psal,pjob from emp where empno=eno;
end;

doc命令,desc 表名 会得到表结构

---???思考问题,如果查询某个原工的所有信息---àout参数太多?

---???查询某个部门中所有原工信息---àout中返回集合?

未完,待续。。。。。

猜你喜欢

转载自www.cnblogs.com/person008/p/9145332.html