您好,登录后才能下订单哦!
一个很熟悉的词语函数,最早接触于函数是数学课,万分没想到它在以后的学习中越来越重要。编程语言都会单独给函数开一章节来详细介绍,可见在编程语言中的地位杠杠的!
那么函数真的很难学吗?起码对于编程来说(源码除外),除了大量系统函数使用语法比较难记外,其实还是蛮实用和容易接受。
函数、存储过程是什么?那么把增删改查等放在一起,一并执行更高效的来完成这些操作这个代码块(组合)称为存储过程或函数。
函数在Oracle中必须有返回值,这也是区分与存储过程的区别,函数分为两种:1、系统函数 2、自定义函数 本篇的文章是分享的自定义函数(系统在后面更新)
什么是自定义函数,当然是根据我们的需求,按章我们的意愿去实现一些功能比如
1、函数功能与划分:
自定义函数明确这个函数干什么,完成什么需求而创建,,每个独立功能应该用函数单独实现,多个功能在同一函数去实现,增加代码的复杂性,而且不容易维护,不易最大化实现复用,针对功能实现函数。
2、函数的参数
函数参数可以表示无参合形参,形参需要指定数据类型,当参数传递到内部的时候,参数是不可改变的。
3、返回值
函数必须具备返回值,不能返回集合参数,所以,记录与记录集不是Oracle中类型。
格式:
create or replace function fun_one
return number as
begin
return 123;
end fun_one;
/
解释:
create or replace function来创建函数的关键字,然后后面是根返回值数据类型,begin -- end 之间代码是函数定义。
格式:
select object_id,object_name,object_type,status from user_objects where lower(object_name)='函数名';
select name,type,line,text from user_soucre where lower(name)='函数名';
解释:
解释一下,查询的是user_objects和user_soucre两个表,查询函数状态和详细函数创建过程的语句,我们在创建时候函数名称无论大小写,在存储在数据字典都会以大写的方式存储,lower()函数是大写变小写的意思,函数名可以输入小写来查询。
格式:
declare msy number;
begin
msg := fun_one;--把创建的函数复制给msg变量
dbms_output.put_line(msg);
end;
解释:关键字declaer声明一个变量,然后基于函数赋值,输出变量函数,\可以输出上一回的执行结果,set serveroutput on;开启Oracle输出。
函数的确定性:
函数的确定性就是,每次调用函数,Oracle总是会根据参数来执行相同的步骤,输出结果相同,无论多少次执行结果总是相同,参数不会再函数代码块中变化不可变,具有确定性的函数,可以用关键字deterministic来创建确定函数。
对于频繁使用的函数,使用确定性的函数很大程度上提高数据库性能,那么函数在调用时候会查找以前是否使用过相同参数的函数,如果有直接使用先前执行的结果,而不会去执行函数的定义过程,提高数据库性能,节省计算机资源。
存储过程:
存储过程不需要返回值,不同于函数,函数适用于复杂的计算来提升数据库性能,而过程则更适合执行数据大量的更新,查询等操作。
过程的三类:1、IN 2、OUT 3、IN OUT
那么过程都是啥好处呢?
1、编程SQL接口更新应用的数据,可能会频繁的连接数据库,那么通过API接口来连接会耗费大量的资源,把工作交付过程来实现,大大减少了数据库的执行效率。
2、安全:过程作为数据库中的对象,可以存储过程分配权限来控制整个安全性,同时存储过程实际实现了数据库从编程语言转移到数据库中,数据的完整性操作一直被保留。
3、那么过程存储最初的设计理念之一也是为了可复用。
注意:不能直接实现数据库定义语言,既DDL
格式:
create or replace procedurl pr_xx as begin update 表 set 列 = 10; commit; end pr_xx;
解释:
procedure关键字创建过程.
格式:
execute 过程名称;
-----------------------------
begin
过程名称;
end;
/
----------------------------
解释:
execute来实现调用过程,也可用通过begin函数调用方法来实现,实际也是演示了如何从一个函数或过程中调用另一个函数或过程。
存储过程IN:
格式:
create or replace proceduer update_xx(in_age in number) as begin
update 表 set 列 = in_age;
commit;
end update_xx;
/
解释:
IN参数,传入参数,只进不出的参数。由调用者传递给存储过程之后,由存储过程执行,无论怎样使用参数,无法改变参数的值。对于该存储过程来说,是只读的。如果修改IN的值将会报错!
存储过程OUT:
格式:
create or replace proceduer update_xxx(in_age in number,out_age out number) as begin
update 表 set 列 = in_age;
select 列 into out_age from 表 where 列 = 1;
end update_xxx;
解释:
OUT参数,顾名思义输出,将表列=1的赋值给out_age;
格式:
declaer updated_age number;
begin
update_xxx(20,updated_age);
dbms_output.ut_line(updated_age);
end;
/
解释:
那么看代码,我们声明一个新变量,调用了创建的OUT存储过程,并把变量传递到out_age中,然后输出,一定要为输出指定变量名称,不能用常亮否则将会报错。
存储过程的参数-IN OUT参数
IN OUT参数即可作为输入参数,也可以作为输出参数。所以IN OUT一般用于对参数值的进行处理,并处理结果输出。
举一个比较有意义的列子参数变量交换
格式:
create or replace proceduer swap(in_out1 in out number,in_out2 in out number) as
begin
declaer para number;
begin
para := in_out1;
in_out1 := in_out2;
in_out2 := para;
end;
end;
/
解释:
在JAVA的冒泡排序中也会用到变量置换,那么创建临时变量,来相互交换。
存储过程虽然带来很大的便利,同样存储过程也可以被多个用户调用,针对输出参数的变量,将被频繁无规律的更新,控制变量将非常困难,而且不能使用常量来作为输入参数,否则编译错误。
了解:
存储过程的参数顺序很重要--解决方案:名称表示法(不做介绍)
存储过程参数--参数默认值 在创建存储过程中默认参数的列如下:
in_age in number default 20
函数存储过程,远远不止本文章介绍那么简单,配合条件控制等无限可能,以上是对函数和存储过程学习分享,希望对大家有些帮助。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。