Oracle储存过程和函数

Oracle储存过程和函数

储存过程又名子程序

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,
一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
其他的就不介绍了,百度百科上面都有
创建过程的语法和例子
求平均数的例子(带参)
--中括号就不用说了吧,可写可不写
/*注:“pro_avgSal”为需要创建的存储过程的名字,该名字不可以以阿拉伯数字开头*/
CREATE [OR REPLACE] PROCEDURE pro_avgSal(t_job text.job%type)
AS
   T_avg number(8);
BEGIN
       SELECT avg(字段名)into T_avg FROM 表名 where job =t_job ;
       DBMS_OUTPUT.put_line(T_avg);
END pro_avgSal;
语法:
create [OR REPLACE] procedure 储存过程名([参数名] [类型],[参数名] [类型]IS|AS
[局部变量声明区]
begin
.........
end
调用存储过程

sql语句调用

CALL 储存过程名();--一定要加上小括号,这类似于java的方法

PL/SQL中调用

BEGIN
	储存过程名();--一定要加上小括号,这类似于java的方法
END;
过程参数的三种方式

IN:用于接收调用程序的值 ,默认的参数模式
OUT:用于向调用程序返回值
IN OUT:用于接收调用程序的值,并向调用程序返回更新的值
说白了,就是IN 输入参数,out输出参数, in out 输入参数并返回该参数

将该过程的执行权限授予其他用户
GRANT EXECUTE ON 过程名 TO 用户名;
删除过程
DROP PROCEDURE 过程名;
自主事务
子过程影响父过程的例子

这是我的表
在这里插入图片描述

--创建子过程
CREATE OR REPLACE PROCEDURE t1Pro
as
begin
    update text set SALARY=(SALARY-1000) where id =6;--让id等于6SALARY减少1000
    rollback;--回滚事务
end;
--创建父过程
CREATE OR REPLACE PROCEDURE t2Pro
as
begin
     update text set SALARY=(SALARY-2000) where id =5;--让id等于5SALARY减少2000
     t1Pro();
end;

调用父过程发现,表并没有发生改变,id等于6和等于5的都没有减少。
原因在于在子过程中发生了事务回滚,影响了夫过程

改变之后

--创建子过程
CREATE OR REPLACE PROCEDURE t1Pro
as
 pragma autonomous_transaction;--自主事务定义的关键字,父过程事务互不影响
begin
    update text set SALARY=(SALARY-1000) where id =6;
    rollback;--回滚事务 
end;

这样就实现了子过程不影响父过程,id等于5的SALARY会减少2000但id等于6的却不会改变

自主事务的特征

1.与事务处理的状态无关
2.提交或回滚操作不影响主事务处理
3.自主事务处理的结果对其他事务是可见的
4.能够启动其他自主事务处理

函数

Oracle创建函数是通过PL/SQL自定义编写的,通过关键字function按照自己的需求把复  
杂的业务逻辑封装进PL/SQL函数中,函数提供一个返回值,返回给使用者。这样使用者
就不需要去理解业务逻辑。
创建函数的语法
CREATE [OR REPLACE] FUNCTION 函数名称[参数名 参数类型]RETURN 返回类型
IS|AS
[局部变量声明]
BEGIN
.........
END;

定义函数的限制
1.形参不能是PL/SQL类型
2.函数的返回类型也必须是数据库类型

访问函数的两种方式
使用PL/SQL块

DECLARE
BEGIN
函数名();
END;

使用SQL语句

列:select 函数名(参数) from 表名;

过程和函数的比较

在这里插入图片描述

发布了68 篇原创文章 · 获赞 7 · 访问量 2537

猜你喜欢

转载自blog.csdn.net/Cui6023056/article/details/103870845
今日推荐