函数和存储过程类似,可以简单的理解为一段可以执行某个活动/动作的子程序,可以作为一个系统对象被存储在数据库中,可以重复调用。与存储过程不同的是,函数总是向调用者返回一个值,而存储过程不能有返回值。

CREATE [OR REPLACE] FUNCTION function_name

[(argment [ { IN| IN OUT }] type,

 argment [ { IN | OUT | IN OUT } ] type]

RETURN return_type  

{ IS | AS }

<类型.变量的说明> 

BEGIN

FUNCTION_body

EXCEPTION

异常处理语句

END;

--IN:输入参数,向存储过程传递值,默认类型,可以不写

--OUT:输出参数,用于返回结果。

--IN OUT:作为IN参数向存储过程传递值,同时作为OUT参数返回值。

--REPLACE:指明若已有同名的存储过程存在,那么将被替换成当前创建的版本。

--RETURN只能返回单个值,不能返回多个值。

--可以使用DEFAULT关键字为输入参数指定默认值。
--没有参数的函数
create or replace function get_user return varchar2 is
v_user varchar2(50);
begin
select username into v_user from user_users;
return v_user;
end get_user; --测试
方法一
select get_user from dual; 方法二
SQL> var v_name varchar2(50)
SQL> exec :v_name:=get_user; PL/SQL 过程已成功完成。 SQL> print v_name V_NAME
------------------------------
TEST 方法三
SQL> exec dbms_output.put_line('当前数据库用户是:'||get_user);
当前数据库用户是:TEST PL/SQL 过程已成功完成
--带有IN参数的函数
create or replace function get_empname(v_id in number) return varchar2 as
v_name varchar2(50);
begin
select name into v_name from employee where id = v_id;
return v_name;
exception
when no_data_found then
raise_application_error(-20001, '你输入的ID无效!');
end get_empname;

函数的调用:

把函数作为PL/SQL中的表达式调用

例如:假如函数getID()可以返回值,可以这样调用:SELECT * FROM table WHERE id=getID()

创建一个变量用于接收函数的返回值

例如:VARIABLE id NUMBER;

EXECUTE :id  := getID();

PRINT(id);

调用函数的位置:

l         SELECT 语句的列表部分,eg: SELECT fun(..)….

l         WHERE 或 HAVING 字句 eg:WHERE id=fun(…)…

l         ORDER BY 、CONNECT BY、START WITH、GROUP BY 字句

l         INSERT 语句的VALUES部分 INSERT INTO  table VALUES(..,fun(),..)

l         UPDATE 语句的SET部分 eg:UPDATE table SET name=fun(…)

l         PL/SQL块

要让函数可以在SQL表达式中调用,必须满足以下条件:

1.  应该是stored function

2.  只接收IN参数

3. 传入参数和返回值都必须是SQL支持的类型,不能是PL/SQL中的特殊类型(例如boolean)

函数调用限制
1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数。
2、SQL只能调用带有输入参数,不能带有输出,输入输出函数。
3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)。
4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句。

oracle 自定义函数的更多相关文章

  1. Mybatis下配置调用Oracle自定义函数返回的游标结果集

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  2. 【转】Oracle 自定义函数语法与实例

    原文地址:https://blog.csdn.net/libertine1993/article/details/47264211 Oracle自定义函数的语法如下: create or replac ...

  3. Oracle自定义函数和存储过程示例,自定义函数与存储过程区别

    参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...

  4. Oracle自定义函数1

    用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样,如max(value)函数,其中,value被称为参数.函数参数有3种类型. IN 参数类型:表示输入给函数的参数 ...

  5. Oracle自定义函数

    核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] da ...

  6. Oracle自定义函数&加密

    在sql中频繁使用的功能(逻辑.加密等)可以写成自定义函数进行封装,之后再调用即可. CREATE OR REPLACE FUNCTION "函数名" (参数名 参数类型 参数数据 ...

  7. oracle自定义函数:将使用点分隔符的编码转成层级码格式的编码

    维护一个旧的系统,表设计中只有编码,而没有其他排序相关的字段,然后根据编码排序出现了顺序错乱的问题. 详细地说,其编码设计是使用[.]分隔符的编码,比如1.1.1.1.1.1.1.1.1.2这样的格式 ...

  8. Oracle 自定义函数实现列转行效果

    在 Oracle 领域,我相信一说到列转行大部分人都会立马想到 WM_CONCAT 函数,我觉得主要是因为该函数比较实用.但事实上 WM_CONCAT 并非官方公开函数,使用会存在一定的风险:函数返回 ...

  9. Oracle 自定义函数Function

    示例代码: CREATE OR REPLACE  FUNCTION "MY_DATABASE"."F_GET_USER_COUNT_BY_DEPART" ( D ...

随机推荐

  1. ANDROID内存优化——大汇总(转)

    原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了20 ...

  2. Part 3 talking about constraint in sql

    What is Foreign key and how to create a Foreign key constraint? Note:Foreign Keys are used to enforc ...

  3. [老老实实学WCF] 第三篇 在IIS中寄存服务

    老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我 ...

  4. HTML+CSS学习笔记(9)- CSS的继承、层叠和特殊性

    标签:HTML+CSS 继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这 ...

  5. OpenGL-渲染管线的流程(有图有真相)

    视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 学习shader之前必须知道的事情,shader(着色语言)到 ...

  6. Stack Overflow 2016最新架构探秘

    这篇文章主要揭秘 Stack Overflow 截止到 2016 年的技术架构. 首先给出一个直观的数据,让大家有个初步的印象. 相比于 2013 年 11 月,Stack Overflow 在 20 ...

  7. 正确的安装和使用nvm

    前言 目前主流的node版本管理工具有两种,nvm和n.两者差异挺大的,具体分析可以参考一下淘宝FED团队的一篇文章: 管理 node 版本,选择 nvm 还是 n? 总的来说,nvm有点类似于 Py ...

  8. JavaScript之Function函数深入总结

    整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下 ...

  9. 构建前端Mock Server

    写在前面 最开始只是在做活动页面时苦于效率太低制定了这样一个自动化的工作环境, 所以Github上项目名是Rapid-Dev-Activity-Page(快速开发活动页...). 活动页这类比较简单的 ...

  10. css z-index属性

    原文地址:http://www.neoease.com/css-z-index-property-and-layering-tree/ CSS 中的 z-index 属性用于设置节点的堆叠顺序, 拥有 ...