sql方法function
--定义方法
create or replace function GetAge(vBirthday date) return integer
as
vCurrentYear number;
vBirthYear number;
begin
vCurrentYear := to_char(sysdate,'yyyy');--Oracle变量赋值用:= ,比较用=
vBirthYear := to_char(vBirthday,'yyyy');
return vCurrentYear - vBirthYear;
end;
--调用方法
select t.*, getAge(t.birthday) age from tbl_person t
适用范围
1.只查询,不修改数据库的状态(修改、删除表中记录等)
2.结果集需要通过递归等方法得到时,可以使用函数,函数比较灵活
3.结果集需要直接被引用时,可以使用函数。需要对结果集进行再加工(指放在select语句中等),可以使用函数,函数可以嵌在select等sql语句中。
内容
产生背景(已经有了存储过程,为什么还要使用自定义函数)
与存储过程的区别(存在的意义):
1.能够在select等SQL语句中直接使用自定义函数,存储过程不行。
2.自定义函数可以调用其他函数,也可以调用自己(递归)
3.可以在表列和 CHECK 约束中使用自定义函数来实现特殊列或约束
4.自定义函数不能有任何副作用。函数副作用是指对具有函数外作用域(例如数据库表的修改)的资源状态的任何永久性更改。函数中的语句唯一能做的更改是对函数上的局部对象(如局部游标或局部变量)的更改。不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改 目录,以及生成返回至用户的结果集。存储过程没有此限制
5.数只能返回一个变量。而存储过程可以返回多个
自定义函数不能修改数据库,但它可以调用存储过程,那么在自定义函数中调用一个有修改数据库的操作的存储过程,这个自定义函数能不能执行?
答:自定义函数只能调用扩展存储过程,但是SQL Server 2008的后续版本将删除该功能,不再支持扩展存储过程,所以应避免在开发中使用扩展存储过程。因此,可以得出结论是:实际开发中,函数不会去调用存储过程,也就无法对数据库进行修改操作了。