Oracle存储过程与存储函数-入门

简介: Oracle存储过程与存储函数-入门

网络异常,图片无法展示
|


文章思维导图


一. 存储过程和存储函数的定义


  • 定义:存储在数据库中,供所有用户程序调用的子程序叫做存储过程/存储函数。复杂点的解释:存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。


  • 区别:是否可以通过return返回函数值。

存储函数可以通过return返回函数值;而存储过程不可以。


  • 注意:由于通过out参数,存储过程也可以返回函数值,所以存储过程和存储函数已经没有太大的区别了。而存储函数仍然存在,是由于oracle不断升级,需要实现向下兼容,所以存储函数就一直存留着。


二. 存储过程


1. 创建和使用存储过程


create procedure命令建立存储过程,语法如下:

create [or replace] procedure 过程名(参数列表)
as   -- as不可以省略
PLSQL子程序体;


注意事项:


1> 存储过程或者存储函数,只能创建或者替换。

2> 参数可以带也可以不带。

3>  as相当于PLSQL语句中的declare,用来声明变量、游标等,但是不可以省略


2. 入门案例:


(1)不带参数的存储过程:不用带括号

create or replace procedure sayHello
as
begin
   dbms_output.put_line('HelloWorld');
end;
/


调用方式:


  • <1> 使用execute:
    exec是sqlplus命令,只能在sqlplus中使用,使用时,exec可以直接跟过程名(可以省略括号);


控制台执行示例:

SQL> set serveroutput on;
SQL> exec sayHello;


  • <2> 使用call:


使用call时,要带上括号;call为SQL命令使用时,对场景没有限制。
控制台执行示例:

SQL> set serveroutput on;
SQL> call sayHello();


  • <3> 使用PLSQL语句调用:


控制台执行示例:

SQL> set serveroutput on;
SQL> begin
         sayHello;
    end;
/


(2)带参数的存储过程:


  • 给指定的员工涨100元工资,并且打印涨前和涨后的薪水:

create or replace procedure addSal(pempno in emp.empno%type)
as
    pename emp.ename%type;
    beforesal emp.sal%type;
    aftersal emp.sal%type;
begin
    select ename,sal into pename,beforesal from emp where empno=pempno;
    aftersal:=beforesal+100;
    update emp set sal=aftersal where empno=pempno; 
    dbms_output.put_line('姓名: '||pename||' 涨前工资:'||beforesal||'涨后工资:'||aftersal);
end;
/


网络异常,图片无法展示
|


执行代码截图


** 注意事项:**


  • <1> 要说明,参数是输入参数(in)还是输出参数(out);


  • <2> 为保证调用多个存储过程中处在同一个事务中,所以一般不在存储过程或者存储函数中,commit或rollback;


3. 调试存储过程:


网络异常,图片无法展示
|


SQL Developer 调试存储过程


** 注意事项:**


(1) oracle数据库和PLSQL工具都是放在同一个机器上;


(2) 在开启调试时,可能会报出权限不够的错误信息,通过下面方式进行授权:


网络异常,图片无法展示
|


授权


三. 存储函数
1. 存储函数:


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


2. 创建存储函数的语法:

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


  • 注意事项:


  • (1) 与存储过程注意事项类似,不同的是,必须有个返回值;
  • (2) 参数列表可以有,也可以没有.当没有时,函数名后面不要带括号.

create or replace function queryempannal(pempno in number)
return number
as
  psal emp.sal%type;
  pcomm emp.comm%type;
begin
  select sal,comm into psal,pcomm from emp where empno=pempno;
  return psal*12+nvl(pcomm,0);
end;


四. in和out参数


1.概述


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


  • (2) 过程和函数都可以通过out指定一个或多个输出参数.我们可以利用out参数,在过程和函数中实现返回多个值.
  • a. 存储过程和存储函数都可以有out参数;
  • b. 存储过程和存储函数都可以有多个out参数;
  • c. 存储过程可以通过out参数来实现返回值;


  • (3) 什么时候用存储过程/存储函数?
  • 原则:如果只有一个返回值,用存储函数;否则,就用存储过程.

create or replace procedure queryempinform(eno in number,
                                           pename out varchar2,
                                           psal out number,
                                           pjob out varchar2 )
as
begin
  select ename,sal,job into pename,psal,pjob from emp where empno=eno;
end;
/


相关文章
|
5天前
|
SQL Oracle 关系型数据库
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
本文介绍了多种SQL内置函数,包括单行函数、非空判断函数、日期函数和正则表达式相关函数。每种函数都有详细的参数说明和使用示例,帮助读者更好地理解和应用这些函数。文章强调了字符串操作、数值处理、日期计算和正则表达式的使用方法,并提供了丰富的示例代码。作者建议读者通过自测来巩固学习成果。
11 1
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
|
4月前
|
SQL Oracle 算法
|
4天前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
8 0
|
4月前
|
SQL Oracle 关系型数据库
|
4月前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
4月前
|
Oracle 关系型数据库 数据挖掘
|
7天前
|
存储 SQL NoSQL
|
1月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
31 5
|
1月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
43 3
|
1月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
50 1

推荐镜像

更多