查看: 741|回复: 0

[Oracle数据库] 简单点,学习的方式简单点~(函数存储过程)

发表于 2018-1-25 08:00:00

一个很熟悉的词语函数,最早接触于函数是数学课,万分没想到它在以后的学习中越来越重要。编程语言都会单独给函数开一章节来详细介绍,可见在编程语言中的地位杠杠的!

那么函数真的很难学吗?起码对于编程来说(源码除外),除了大量系统函数使用语法比较难记外,其实还是蛮实用和容易接受。

函数、存储过程是什么?那么把增删改查等放在一起,一并执行更高效的来完成这些操作这个代码块(组合)称为存储过程或函数。

函数在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

函数存储过程,远远不止本文章介绍那么简单,配合条件控制等无限可能,以上是对函数和存储过程学习分享,希望对大家有些帮助。



回复

使用道具 举报