Oracle存储过程和存储函数(1)

来源:互联网 发布:kali linux配置ip地址 编辑:程序博客网 时间:2024/05/17 08:55

这一周老大安排了学习存储过程的任务,下周要用。现在我们就来看看它到底是干啥的

本文内容:主要是介绍了存储过程和存储函数的基本概念、异同和使用时如何传参和部分细节问题,我们将会在下面的内容中和大家一起学习如何在应用程序中访问存储过程和存储函数,来解决本文末尾的两个思考题。

    • 什么是存储过程和存储函数
    • 存储过程和存储函数的异同
    • 存储过程
      • 创建和使用存储过程
      • 第一个存储过程
      • 如何调用这个存储过程
      • Oracle带参的存储过程
        • 带传入参数的存储过程
    • 存储函数
      • 创建存储函数的语法
      • 存储函数举例
    • in和out参数
      • 什么时候用存储过程存储函数
    • 两个思考题


什么是存储过程和存储函数

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

存储过程和存储函数的异同

存储过程和存储函数有相同点:完成特定功能的程序
存储过程和存储函数的区别:是否用return语句返回值(后者可以,前者不可以)

除此之外我们可以认为它们是一样的。

存储过程

创建和使用存储过程

  • 用CREATE PROCEDURE命令建立存储过程和存储函数
  • 语法:
    create [or replace] PROCEDURE 过程名(参数列表)
    AS
    PLSQL子程序体;

第一个存储过程

--第一个存储过程:打印Hello Worldcreate or replace procedure sayhelloworldas    --说明部分begin    dbms_output_put_line("Hello World");end;/

Oracle存储数据库对象默认采用大写的方式,所以在执行脚本后会显示如下内容

PROCEDURE SAYHELLOWORLD 已编译

如何调用这个存储过程

有两种方式:

  • 使用exec语句
    exec sayhelloworld();
    -使用PL/SQL语句
    begin
      sayhelloworld();
      sayhelloworld();
    end;
    /

利用命令行来进行调用存储过程

进入cmd: sqlplus 用户名/密码@192.168.1.1:1521/orcl

然后因为要打印字符串 所以要打开屏幕输出开关

set serveroutput on

然后就可以利用上面所讲到的两个方法来执行上面的存储过程。

Oracle带参的存储过程

记得我们在传参的时候要指出是传入参数还是传出参数

带传入参数的存储过程:

--创建一个带参数的存储过程:--给指定的员工涨100元的工资,并且打印涨前和涨后的薪水create or replace procedure raisesalary(eno in number)as--定义一个变量保存涨前的薪水--引用表中emp.sal这个字段的类型来作为 psal变量的类型    psal emp.sal%type;begin    --得到员工涨前的薪水    select sal into psal from where empno=eno;    --给该员工涨100    update emp set sal=sal + 100 where empno = eno;    --打印    dbms_output.put_line('涨前: '||psal||' 涨后:'||(psal +100)||'  )end;/

下面可以运行这个脚本 显示编译成功

begin    raisesalary(7839);    raisesalary(7566);    commit;end;/

存储函数

  • 函数为一命名的存储函数,可带参数,并返回一计算值。
  • 函数和过程的结构类似,但必须有一个RETURN字句,用于返回函数值。(这也是和过程不一样的地方)

创建存储函数的语法

create [or replace] FUNCTION 函数名(参数列表)
return 函数值类型
AS
PLSQL子程序体;

存储函数举例

  • EG:查询某个员工的年收入
  • 调用存储函数
--存储函数:查询某个员工年收入create or place function queryempincome(eno in number)return numberas--定义变量保存员工的薪水和奖金psal emp.sal%type;pcomm emp.comm%type;begin--得到该员工的月薪和奖金select sal,comm into psal,pcomm from emp where empno-eno;--直接返回年收入return psal*12 + pcomm;--上面这条语句要注意 如果有一条为空 那么所有结果都为空 这时我们常常要用到函数nvl函数,改写之后的语句如下retrun psal*12+nvl(pcomm,0);end;/

in和out参数

  • 一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值。
  • 过程和函数都可以通过out指定一个或多个输出函数。我们可以利用out参数,在过程和函数中实现返回多个值
    • 存储过程和存储函数都可以有out参数
    • 存储过程和存储函数都可以有**多个**out参数
    • 存储过程可以通过out参数来实现返回值

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

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

--out参数:查询某个员工姓名 月薪和职位create or replace procedure queryempinform(eno in number,                                          pename out varchar2,                                          psal out number,                                          pjob out varchar2)asbegin--得到该员工的姓名 月薪和职位select ename,sal,empjob into pename,psal,pjob from emp where empono=eno;end;/

两个思考题

1。查询某个员工的所有信息 —》 out参数太多?
2。查询某个部门中所有员工的所有信息 –》out中返回集合?

会在后面的存储过程/存储函数的文章中写出来

以上内容来自于慕课网http://www.imooc.com/video/7294,转载请注明出处