(1)创建函数
作为一种PL/SQL程序块,与匿名块类似,函数的创建语句中也包含了声明、执行与异常处理部分,具体创建语法如下。
其中:
①parameter1、parameter2是函数的形式参数,需要同时声明其数据类型,也可以赋予一个初始默认值。注意声明其数据类型时不能指定长度与精度。
②IN、OUT、IN OUT是形式参数的模式。若省略,则为IN模式。IN模式的形式参数只能将实际参数传递给形式参数,进入函数内部,但只能读不能写,函数返回时实际参数的值不变。OUT模式的形式参数会忽略调用时的实际参数值(或说该形式参数的初始值总是NULL),但在函数内部可以被读或写,函数返回时形式参数的值会赋予实际参数。IN OUT具有前两种模式的特性,即调用时,实际参数的值总是传递给形式参数,结束时,形式参数的值传递给实际参数。调用时,对于IN模式的实际参数可以是常量或变量,但对于OUT和IN OUT模式的实际参数必须是变量。
③OR REPALCE关键字用于替换已有同名函数,一般只有在确认function_name函数是新函数或者确实需要修改已有函数的定义时,才使用OR REPALCE关键字,否则容易误删除有用的函数。
④declare_section、statements、Exception_handler与匿名块一样,同样对应程序的声明、执行与异常处理部分。
⑤RETURN用于指明函数的数据类型,也就是执行函数所返回的数据的数据类型(不能指定长度与精度)。需要注意的是,函数必须向调用者返回一个值,因此执行部分的语句在执行时,必须保证执行到一条返回值的RETURN语句,特别是在有很多条件分支的情况下,尤其需要小心。
应用示例,创建一个函数,用于获取所提供部门编号的部门工资总和。代码如下:
(2)调用函数
函数可以在SQL语句中调用函数,也可以在PL/SQL程序中调用函数,其调用语句只能作为表达式的组成部分。
函数声明时所定义的参数称为形式参数,应用程序调用时为函数传递的参数称为实际参数。应用程序在调用函数时,可以使用以下3种方法向函数传递参数。
1)位置表示法
位置表示法即在调用时按形式参数的排列顺序,依次写出实际参数的名称,而将形式参数与实际参数关联起来进行传递。用这种方法进行调用,形式参数与实际参数的名称是相互独立、没有关系的,强调次序才是重要的。
语法格式为:
用位置表示法传递参数,计算某部门的工资总和,代码如下。(www.daowen.com)
2)名称表示法
在调用时按形式参数与实际参数的名称,写出实际参数对应的形式参数,而将形式参数与实际参数关联起来进行传递。这种方法,形式参数与实际参数的名称是相互独立、没有关系的,名称的对应关系才是最重要的,次序并不重要。语法格式为:
其中:
①parameter1,parameter2为形式参数,它必须与函数定义时所声明的形式参数名称相同。
②parameter_value1,parameter_value2为实际参数。
在这种格式中,形式参数与实际参数成对出现,相互间关系唯一确定,所以参数的顺序可以任意排列。
用名称表示法传递参数,计算某部门的工资总和,代码如下。
3)组合传递法
组合传递法即是指在调用一个函数时,同时使用位置表示法和名称表示法为函数传递参数。采用这种参数传递方法时,使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面。也就是说,无论函数具有多少个参数,只要其中有一个参数使用名称表示法,其后所有的参数都必须使用名称表示法。
创建一个函数,用于计算指定了最小值、最大值与步长的等差数列的累加和,并用组合传递法传递参数,输出结果,代码如下。
无论采用哪一种参数传递方法,实际参数和形式参数之间的数据传递只有两种方法:传址法和传值法。所谓传址法是指在调用函数时,将实际参数的地址指针传递给形式参数,使形式参数和实际参数指向内存中的同一区域,从而实现参数数据的传递,这种方法又称为参照法,即形式参数参照实际参数数据。输入参数均采用传址法传递数据。
传值法是指将实际参数的数据复制到形式参数,而不是传递实际参数的地址。默认时,输出参数和输入/输出参数均采用传值法。在函数调用时,Oracle将实际参数数据复制到输入/输出参数,而当函数正常运行退出时,又将输出形式参数和输入/输出形式参数数据复制到实际参数变量中。
(3)参数默认值
在CREATE OR REPLACE FUNCTION语句中声明函数参数时可以使用DEFAULT关键字或赋值符(:=)为输入参数指定默认值。前面求和的函数可作如下改变。
在创建具有默认值的函数后,进行函数调用时,如果没有为具有默认值的参数提供实际参数值,函数将使用该参数的默认值。但当调用者为默认参数提供实际参数时,函数将使用实际参数值。在创建函数时,只能为输入参数设置默认值,而不能为输入/输出参数设置默认值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。