--==================

-- PL/SQL --> 函数

--==================

函数通常用于返回特定的数据。其实质是一个有名字的PL/SQL块,作为一个schema对象存储于数据库,可以被反复执行。函数通常被作为

一个表达式来调用或存储过程的一个参数,具有返回值。

一、建立函数的语法

CREATE [ OR REPLACE ] FUNCTION function_name

(argument1 [mode1] datatype1,

argument2 [mode2] datetype2,

...)

RETURN datatype

IS | AS

[local_variable_declarations;...]

BEGIN

--actions;

RETURN expression;

END [function_name];

建立函数的几点注意事项

1.指定参数数据类型时(argument),不能指定其长度

2.函数头部必须指定return子句,函数体内至少要包含一条return语句

3.可以指定in参数,也可以指定out参数,以及in out 参数

4.可以为参数指定缺省值。指定缺省值时使用default关键字。如arg1 varchar2 default 'SCOTT'

二、使用函数的优点

1.增加了代码的灵活性,可以完成一些较为复杂的任务,以及仅仅通过SQL无法完成的任务

2.可以直接将函数使用到where子句中来过滤数据

3.可以作为存储过程的参数使用,是存储过程的一种补充

三、建立函数

1.建立不带参数的函数

scott@ORCL> create or replace function get_user

2  return varchar2

3  is

4    v_user varchar2(20);

5  begin

6    select username into v_user from user_users;

7    return v_user;

8  end;

9  /

Function created.

--使用全局变量接收函数的返回值

scott@ORCL> var v1 varchar2(20)

scott@ORCL> exec :v1:=get_user

PL/SQL procedure successfully completed.

scott@ORCL> print v1;

V1

--------------------------------

SCOTT

--使用本地变量接收函数的返回值

scott@ORCL> set serveroutput on;

scott@ORCL> declare user_name varchar2(20);

2  begin

3  user_name:=get_user();

4  dbms_output.put_line('Current user: '||user_name);

5  end;

6  /

Current user: SCOTT

PL/SQL procedure successfully completed.

--在SQL语句中直接调用函数

scott@ORCL> select get_user from dual;

GET_USER

---------------------

SCOTT

--使用dbms_output调用函数(此调用作为存储过程的一个参数来进行调用)

scott@ORCL> set serveroutput on;

scott@ORCL> exec dbms_output.put_line('Current user: '||get_user);

Current user: SCOTT

2.建立带有in 参数的函数

scott@ORCL> create or replace function raise_sal(name in varchar2)    --注意此处定义时参数并为指定类型的长度

2  return number

3  as

4    v_sal emp.sal%type;

5  begin

6    select sal*1.2 into v_sal from emp

7    where upper(ename)=upper(name);

8    return v_sal;

9  exception

10    when no_data_found then

11    raise_application_error(-20000,'Current Employee is not exists');

12  end;

13  /

Function created.

scott@ORCL> select sal,raise_sal('SCOTT') from emp where ename='SCOTT';

SAL RAISE_SAL('SCOTT')

---------- ------------------

3100               3720

scott@ORCL> select raise_sal('Robinson') from dual;

select raise_sal('Robinson') from dual

*

ERROR at line 1:

ORA-20000: Current Employee is not exists

ORA-06512: at "SCOTT.GET_SAL", line 11

3.建立带有out参数的函数

scott@ORCL> create or replace function get_info

2  (name varchar2,title out varchar2)

3  return varchar2

4  as

5    deptname dept.dname%type;

6  begin

7    select e.job,d.dname into title,deptname

8    from emp e inner join dept d

9      on e.deptno=d.deptno

10    where upper(e.ename)=upper(name);

11    return deptname;

12  exception

13    when no_data_found then

14      raise_application_error(-20000,'Current Employee is not exists');

15  end;

16  /

Function created.

注意对于使用out参数的函数,不能使用SQL语句来调用。而必须定义变量接收out参数和函数的返回值。

调用如下

scott@ORCL> var job varchar2(20);

scott@ORCL> var dname varchar2(20);

scott@ORCL> exec :dname:=get_info('scott',:job);

PL/SQL procedure successfully completed.

scott@ORCL> print dname job;

DNAME

--------------------------------

RESEARCH

JOB

--------------------------------

ANALYST

3.建立带有in out参数的函数

scott@ORCL> create or replace function comp

2  (num1 number,num2 in out number)

3  return number

4  as

5    v_result number(6);

6    v_remainder number;

7  begin

8    v_result:=num1*num2;

9    v_remainder:=mod(num1,num2);

10    num2:=v_remainder;

11    return v_result;

12  exception

13    when zero_divide then

14      raise_application_error(-20000,'Divison by zero');

15  end;

16  /

Function created.

scott@ORCL> var result1 number;

scott@ORCL> var result2 number;

scott@ORCL> exec :result2:=10

PL/SQL procedure successfully completed.

scott@ORCL> exec :result1:=comp(16,:result2);

PL/SQL procedure successfully completed.

scott@ORCL> print result1 result2;

RESULT1

----------

160

RESULT2

----------

6

四、函数的调用及限制

1.函数的调用(其具体调用方法参照上面的演示)

a.使用全局变量接收函数的返回值

b.使用本地变量接受函数的返回值

c.在SQL语句中直接调用函数

d.使用dbms_output调用函数

注:函数在调用的时候需要按位置指定参数,没有存储过程参数传递灵活

必须具有execute 函数的权限

2.函数在SQL中调用的主要场合

由于函数必须要返回数据,因此只能作为表达式的一部分调用。此外函数可以在SQL语句的以下部分调用

a. select 命令的选择列表或子查询中

b. 条件表达式where, having子句中

c. connect by , start with ,order by 以及group by 子句中

d. insert 命令的values子句中

f. update 命令的set 子句中

3.函数在SQL中调用的限制

a. SQL语句中只能调用存储在服务器端的函数,而不能调用存储于客户端的函数

b. SQL语句中调用的函数只能带有输入参数IN,而不能带有输出参数OUT 以及输入输出参数IN OUT

c. SQL语句中调用的函数只能使用SQL支持的标准数据类型,不能使用PL/SQL特有的类型,如boolean,table,record等

d. SQL语句中调用的函数不能包含insert ,update 和delete 语句

下面演示SQL调用时不能完整DML操作示例

--创建一张表tb_emp

scott@ORCL> create table tb_emp as select * from emp;

--创建一个函数,用于删除tb_emp表中指定的empno号的雇员信息,并返回其薪资

scott@ORCL> create or replace function delete_oper(no number)

2  return number

3  as

4    v_sal emp.sal%type;

5    begin

6    select sal into v_sal from tb_emp where empno=no;

7    delete from tb_emp where empno=no;

8    return v_sal;

9    end;

10  /

Function created.

--使用SQL语句调用时,收到了错误信息,在内部查询内不能完成DML操作

scott@ORCL> select delete_oper(7788) from dual;

select delete_oper(7788) from dual

*

ERROR at line 1:

ORA-14551: cannot perform a DML operation inside a query

ORA-06512: at "SCOTT.DELETE_OPER", line 7

--使用exec执行时函数被成功执行

scott@ORCL> var v_no number;

scott@ORCL> exec :v_no:=delete_oper(7788);

PL/SQL procedure successfully completed.

scott@ORCL> print v_no;

V_NO

----------

3100

scott@ORCL> select * from tb_emp where empno=7788;

no rows selected

--下面的演示表明,不能使用DML语句来调用函数

scott@ORCL> update emp set sal=raise_sal('SCOTT') where ename='SCOTT';

update emp set sal=raise_sal('SCOTT') where ename='SCOTT'

*

ERROR at line 1:

ORA-04091: table SCOTT.EMP is mutating, trigger/function may not see it

ORA-06512: at "SCOTT.RAISE_SAL", line 6

五、函数的管理

函数使用了与存储过程相关的视图,可以从系统视图中获得函数的相关信息

DBA_OBJECTS

DBA_SOURCE

USER_OBJECTS

USER_SOURCE

--查看函数的源码

scott@ORCL> select text from user_source where name='DELETE_OPER' order by line;

TEXT

------------------------------------------------------------

function delete_oper(no number)

return number

as

v_sal emp.sal%type;

begin

select sal into v_sal from tb_emp where empno=no;

delete from tb_emp where empno=no;

commit;

return v_sal;

end;

--查看函数的参数信息

scott@ORCL> desc delete_oper;

FUNCTION delete_oper RETURNS NUMBER

Argument Name                  Type                    In/Out Default?

------------------------------ ----------------------- ------ --------

NO                             NUMBER                  IN

六、函数与存储过程的差异

存储过程                                            函数

----------------------------------                -------------------------------

不能被作为表达式调用                                只能作为表达式被调用

声明头部关键字为procedure                        声明头部关键字为function

声明头部不包含return关键字来描述返回类型         头部必须包含return关键字,且PL/SQL块中至少包含一个有效的return语句

可以通过out,in out返回零个或多个值               通过return语句返回一个与头部声明中类型一致的值,也可使用in,in out返回值

SQL语句中不可调用存储过程                        SQL语句可以调用函数

多用于数据库中完成特定的操作,如删除,更新,插入等DML操作     多用于特定的数据如选择等

七、更多参考

有关SQL请参考

SQL 基础--> 子查询

SQL 基础-->多表查询

SQL基础-->分组与分组函数

SQL 基础-->常用函数

SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

有关PL/SQL请参考

PL/SQL --> 语言基础

PL/SQL --> 流程控制

PL/SQL --> 存储过程

PL/SQL --> 函数

PL/SQL --> 游标

PL/SQL -->隐式游标(SQL%FOUND)

PL/SQL --> 异常处理(Exception)

PL/SQL --> PL/SQL记录

PL/SQL --> 包的创建与管理

PL/SQL --> 包重载、初始化

PL/SQL --> DBMS_DDL包的使用

PL/SQL --> DML 触发器

PL/SQL --> INSTEAD OF 触发器

PL/SQL -- 函数相关推荐

  1. 在SQL中使用PL/SQL函数存在的问题

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  2. Ask Tom之中英文对照20051228——PL/SQL函数返回CLOB类型值

    Ask Tom之中英文对照20051228--PL/SQL函数返回CLOB类型值 问: 我已经通读了相关文档,但是在实际应用中仍然不太清楚我的理解是否确切. 我已经创建了如下的函数--产生一个小的结果 ...

  3. oracle 12c pl/sql语言,ORACLE 12C SQL语句中通过with 定义PL/SQL 函数

    在ORACLE 12C支持在sql语句中编写函数,用来实现sql语句操作需要使用函数的部分功能,该功能对于你不想在数据库中新建函数 or 你的库是read only模式下要使用新函数实现某种功能,可以 ...

  4. oracle 11g函数包缓存,Oracle 11g 的PL/SQL函数结果缓存

    模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作(result_cache RELIES_ON(test1 ...

  5. SQL/Oracle——第六章 PL/SQL函数(作业3)

    第6章:PL/SQL块 --6-19 beginp3(var_job=>'SALESMAN',i,j,k); end; /declarecursor cur_emp(var_job in var ...

  6. oracle pl/sql 函数

    函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句.而在函数体内必须包含return语句返回的数据.我们可以使用create function来建立函数. 1).接下来通过一个案 ...

  7. PL/SQL函数总结

    number数字类型函数 ABS(x) 函数,此函数用来返回一个数的绝对值. ACOS(x)函数,返回X的反余弦值.X范围从1到-1,输入值从0到派,以弧度为单位. ASIN(x)函数,返回X的反正弦 ...

  8. Oracle笔记 十一、PL/SQL函数和触发器

    --创建函数 create or replace function add_sal(sSal number) return number is begin if (sSal > 5000) th ...

  9. pl/sql函数学习

    7種函數的詳細介紹及用法: 1.錯誤報告(error reporting)函數    sqlcode   返回oracle錯誤號    sqlerrm   返回oracle錯誤信息 主要用於異常處理 ...

最新文章

  1. 《HTML5与CSS3实例教程》
  2. springcloud流程图
  3. linux --常用命令
  4. 单链表的代码python_python版本单链表实现代码
  5. Linux基本操作——Linux磁盘基本概念
  6. 葡萄酒java_基于jsp的红酒网站-JavaEE实现红酒网站 - java项目源码
  7. python学习之dict的items(),values(),keys()
  8. python 在线培训费用-线下python培训要多少钱?
  9. 2018前端面试题总结
  10. Windows系统服务原理
  11. 支付宝直付通怎么签约教程详解,支付宝直付通开通需要什么条件!
  12. 利用cmake来编译sim800c,sim868 app
  13. setTimeout()方法实现延时执行其他功能
  14. 「黑科技」盘点那些脑洞大开的人类设计的“异形”机器人
  15. 补淘宝单平台哪个便宜?如何补单才能增加权重?
  16. 财务业务:会计凭证的审核
  17. kafka的offset是个什么鬼。。
  18. ssh mysql 导出excel_使用ssh远程执行命令批量导出数据库到本地(转)
  19. echarts K线图
  20. 维度灾难 维数灾难 暂记

热门文章

  1. python自带编译器如何生成exe_别再问我怎么Python打包成exe了!
  2. Python 十六进制转Base64_python基础day03笔记
  3. 将优化问题转化为决策问题
  4. 【项目管理】各种常用工具图表说明和示例
  5. 信息系统项目管理师优秀论文:项目整体管理
  6. 2020-08-29
  7. 笔记-项目采购管理-索赔的处理
  8. 2020年1月份学习总结,死线(Deadline)杀死团队拖延症
  9. 笔记-计算机网络基础-综合布线系统
  10. 信息系统项目管理师-项目合同管理核心知识点思维脑图