ORACLE官方SQL语言参考之关于用户定义函数的实例讲解
关于用户定义函数
可以在 pl/sql、java 或 c 中编写用户定义函数, 以提供 sql 或 sql 内置函数中不可用的功能。用户定义的函数可以出现在 sql 语句中, 而无论表达式的位置如何。
例如, 用户定义函数可用于以下内容:
select 语句的选择列表select
where子句的条件
connectby,startwith,orderby, 按子句groupby
insert语句的values子句
update语句的set子句
注意:
oracle sql 不支持调用具有布尔参数或返回的函数。因此, 如果您的用户定义函数将从 sql 语句中调用, 则必须设计它们以返回数字 (0 或 1) 或字符串 ('true' 或 'false').
user_defined_function::=
插图 "user_defined_function" 的说明
可选表达式列表必须与函数、包或运算符的属性相匹配。
对用户定义函数的限制distinct的和all的关键字仅对用户定义的聚合函数有效。
另请参见:
创建函数, 以了解有关创建函数的信息, 包括对用户定义函数的限制
oracle 高级应用人员指南, 用于全面讨论用户功能的创建和使用
先决条件
用户定义的函数必须创建为*函数, 或者使用包规范声明, 然后才能在 sql 语句中命名。
若要在 sql 表达式中使用用户函数, 必须拥有或具有对用户函数的execute权限。若要查询使用用户函数定义的视图, 您必须在视图上具有select权限。从视图中选择不需要单独的execute权限。
另请参见:
创建有关创建*函数的信息并创建包以了解有关指定打包函数的信息的功能
名称优先级
在 sql 语句中, 数据库列的名称优先于没有参数的函数的名称。例如, 如果人力资源管理器在hr架构中创建以下两个对象:
create table new_emps (new_sal number, ...);
create function new_sal return number is begin ... end;
然后在下面两个语句中, 对new_sal的引用指的是列new_emps.new_sal:
select new_sal from new_emps;
select new_emps.new_sal from new_emps;
要访问函数new_sal, 您可以输入:
select hr.new_sal from new_emps;
下面是对 sql 表达式中允许的用户函数的一些示例调用:
circle_area (radius)
payroll.tax_rate (empno)
hr.employees.tax_rate (dependent, empno)@remote
例子要从架构hr调用tax_rate用户函数, 请对tax_table中的ss_no和sal列执行该功能, 并指定以下内容:
select hr.tax_rate (ss_no, sal)
into income_tax
from tax_table where ss_no = tax_id;
ininto子句是 pl/sql, 允许您将结果放入变量income_tax.
命名约定
如果只给出一个可选架构或包名称, 则第一个标识符可以是架构名称或包名称。例如, 确定在参考payroll单中是否有payroll。tax_rate是一个架构或包名称, oracle 数据库的收益如下:
检查当前架构中的payroll包。
如果找不到payroll包, 则查找包含*tax_rate函数的架构名称payroll。如果找不到此类函数, 则返回错误。
如果在当前架构中找到了payroll包, 请在payroll包中查找tax_rate函数。如果找不到此类函数, 则返回错误。
还可以使用已为其定义的任何同义词引用存储的*函数。