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

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

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

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

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