`

Oracle_PL_ SQL_ 教程:函数

 
阅读更多
--######################################--

--函数

--王林 2012.07.06

--######################################--

 

--PL/SQL中有值传递和引用传递函数,两种函数都返回输出值。

--函数输出值可以是任何SQL或PL/SQL数据类型

--可以在SQL语句中使用返回SQL数据类型的函数,返回PL/SQL数据类型的函数只能用于PL/SQL/块中。

--例外的是:不能在SQL查询中调用包含DML操作的存储函数,如果这样做会引发ORA-14551错误,说明不能在查询中使用DML

--不过,可在插入、更新和删除中调用执行DML操作的函数

--函数也可以包含嵌套命名块(他们是局部函数和过程)。可以在函数的声明块中定义命名块,同样可以在执行块中嵌套命名块。

--三种模式的形参:只读参数IN模式,只写形参OUT模式,用于读写形参的IN OUT模式

--通用形式:

CREATE [OR REPLACE] FUNCTION fun_name

[( arg1 [IN][OUT][NOCOPY] sql_datatype | plsql_datatype

 , arg2 [IN][OUT][NOCOPY] sql_datatype | plsql_datatype )]

RETURN { sql_datatype | plsql_datatype }

--PRAGMA必须在包规范而不是在包主体中定义,一个函数只能有一个PRAGMA,

[ AUTHID [ DEFINER ] [ CURRENT_USER ]]

[ DETERMINISTIC | PARALLEL_ENABLE ]

[ PIPELINED ]

--ORACLE11g引入跨会话结果缓存,通过RESULT_CACHE字句定义函数可以实现这一功能。对这些函数的每一个调用存储实参和结果。当函数被再次调用时,就可以寻找跨会话缓存中的结果,避免代码再次运行。其结果存储在SGA中。

[ RESULT_CACHE [ RELIES_ON table_name ]]

{ IS | AS }

BEGIN

    execution_statements

    RETURN VARIABLE;

[ EXCEPTION ]

    exception_handling_statements

END [ fun_name ];

 

--######################################--

/*

(1)DETERMINISTIC字句:用于保证函数对于任何输入总是以相同的方式工作,这一类型的保证要求函数不从外数据源(如包或者数据库)

读或者写数据。只有确定性函数(DETERMINISTIC function)工作在物化视图和基于函数的索引中。对于用于SQL语句字句(如WHERE、

ORDER BY或GROUP BY)中的用户定义的函数,或者SQL对象类型方法(MAP或ORDER)来说,他们是被推荐的方法。

确定性函数通常用完全相同的方式处理参数。这意味着不管你提交什么值,函数都以相同的方式工作,不应对包变量或来自数据库的数据有内部依赖性*/

 

--Demo1:计算投资的现值:

CREATE OR REPLACE FUNCTION pv

( future_value NUMBER

, periods      NUMBER

, interest     NUMBER )

RETURN NUMBER DETERMINISTIC 

IS

BEGIN

    RETURN future_value/((1+interest)**periods);

END pv;

--SQL Command->编译->执行:

var res NUMBER

call pv(10000,5,6) into :res;

--结果:

Method called

res

---------

0.594990182661986

 

--######################################--

/*

(2)PARALLEL_ENABLE字句:让函数支持并行查询能力。这一类型的保证要求函数不从外数据源(如包或者数据库)读或者写数据。

可以考虑为并行操作指定安全的函数以提高吞吐量,但ORACLE11g优化器也可能在认为函数对于并行操作来说安全时才运行未指定的函数。

JAVA方法和任何外部C程序对于并行操作来说从来都是不安全的。

物化视图:和关系数据库中的标准视图不一样,物化视图是缓存的结果集。作为缓存的结果集,他存储为具体表、

物化视图对查询能作出更快的响应,因为他不要求每次都用资源动态构建视图。代价就是物化视图通常有些过时,因为从视图缓存时到被访问时,

底部数据可能发生了改变,如果底层数据表不是很频繁的改变,而查询速度很重要,可以考虑使用物化视图,比如数据库仓库。

*/

 

--Demo2:下列函数支持并行SQL操作,将姓、名和中间名合并为单个字符:

CREATE OR REPLACE FUNCTION pv

( last_name   VARCHAR2 

, first_name  VARCHAR2

, middle_initial VARCHAR2)

RETURN VARCHAR2 PARALLEL_ENABLE

IS

BEGIN

    RETURN last_name

        || ','

        || first_name

        || ' '

        || middle_initial;

END;

--SQL Command->编译->执行:

SELECT pv(last_name , first_name, middle_initial) AS full_name 

  FROM contact 

 ORDER BY last_name,first_name,middle_initial;

--并行操作并不总发生,对于较小的数据集来说,并行操作是昂贵的。ORACLE11G优化器会判断何时以并行模式运行操作。有时,如果函数没有标记为启用并行,则优化器也会并行运行他。    

 

--######################################--

--函数参数的几种形式

 

--######################################--

--1.没有参数的函数

 

--Demo3:

CREATE OR REPLACE FUNCTION get_user

RETURN VARCHAR2 

IS

    v_user VARCHAR2 (20);

BEGIN

    SELECT a.username 

      INTO v_user

      FROM user_users a 

     WHERE ROWNUM < 2;

    RETURN v_user;

END get_user;

 

--######################

--调用函数时有形参的时候要括号,没有形参的时候不要括号

--函数用于返回特定数据。执行时的找一个变量接收函数的返回值

--调用方法1:SQL窗口

SELECT get_user FROM dual;

--调用方法2:命令窗口   

var v_name varchar2(50)   

exec :v_name := get_user;

--调用方法3:SQL窗口

exec dbms_output.put_line('The user is:'||get_user);      

 

--######################################--

--2.带有IN参数的函数       

 

--Demo4:

CREATE OR REPLACE FUNCTION pv(v_id IN NUMBER) 

RETURN VARCHAR2 

AS   

    v_name VARCHAR2 (50);   

BEGIN     

    SELECT a.ename INTO v_name 

      FROM scott.emp a 

     WHERE a.empno = v_id;   

    RETURN v_name;   

EXCEPTION    

    WHEN no_data_found THEN     

        raise_application_error(-20001, ' ID is wrong');   

END pv;  

--调用方法1:SQL窗口

SELECT pv(7536) FROM dual;

--调用方法2:命令窗口

exec dbms_output.put_line(pv(7536));

 

--######################################--

--3.带out参数的函数 

 

--Demo5:

CREATE OR REPLACE FUNCTION get_info

( e_name     VARCHAR2 

, job    OUT VARCHAR2 ) 

RETURN NUMBER 

IS  

    res NUMBER; 

BEGIN 

   SELECT a.sal

        , a.job 

     INTO res

        , job 

     FROM scott.emp a 

    WHERE a.ename = e_name; 

   RETURN (res); 

END get_info; 

--SQL Command窗口->编译->执行:

var job varchar2(20) 

var dname varchar2(20) 

exec :dname := get_info('SCOTT',:job) 

 

--######################################--

--4.带in out参数的函数 

 

--Demo6:

CREATE OR REPLACE FUNCTION demo

( num1        NUMBER 

, num2 IN OUT NUMBER ) 

RETURN NUMBER 

IS 

    v_result    NUMBER (6); 

    v_remainder NUMBER; 

BEGIN 

    v_result    := num1 / num2; 

    v_remainder := MOD (num1 , num2); 

    num2        := v_remainder; 

    RETURN (v_result); 

EXCEPTION

    WHEN zero_divide THEN 

        raise_application_error (-20000 , 'you have made one 0' ); 

END demo; 

--SQL Command->编译->执行:

var result1 NUMBER;

var result2 NUMBER;

exec :result2 :=30

--执行结果: 

PL/SQL procedure successfully completed

result2

---------

30

--继续->执行:

SQL> EXEC :result1 := demo (100 , :result2);

--执行结果: 

PL/SQL procedure successfully completed

result1

---------

3

result2

---------

10

 

--######################################--

/*

函数调用限制

1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数。

2、SQL只能调用带有输入参数,不能带有输出,输入输出参数的函数。

3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)。

4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句。

*/

 

分享到:
评论

相关推荐

    Oracle_PL(SQL)单行函数和组函数及使用

    Oracle_PL(SQL)单行函数和组函数及使用

    Oracle_function_package_procedure.rar_oracle_pl sql function_pl/

    pl/sql中oracle的函数,过程,包,事务等介绍

    Oracle_PL(SQL).rar_oracle

    Oracle_PL(SQL)单行函数和组函数及使用.pdf

    Oracle_SQL_PL/SQL书写规范性能优化技巧.doc

    PL/SQL书写规范 1、 语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留字大写。 2、 连接符or、in、and、以及=、、&gt;=等前后加上一个空格。 3、 对较为复杂的sql语句加上注释,说明算法、...

    oracle_PL_SQL程序设计(上下册共26章)_高级完整书签

    oracle_PL_SQL程序设计(上下册共26章),高级完整书签 第1部分 PL/SQL编程 第2部分 PL/SQL程序结构 第3部分 PL/SQL数据 第4部分 PL/SQL中的sql 第5部分 构造PL/SQL应用程序 第6部分 高级PL/SQL主题 附录A 正则表达式的...

    PL_SQL 教程及帮助,ORACLE常用函数

    包含: a.Oracle9i+PL_SQL从入门到精通.pdf b.PL SQL培训教程.PDF c.oracle函数大全.doc

    oracle-plsql.zip_oracle_pl sql 分组查询_plsql_plsql 分组查询

    单行查询 分组查询 多表查询 子查询 高级查询 高级查询 数据字典 约束 视图 索引 游标 函数 存储过程 触发器 事务管理 用户管理 备份 恢复

    Oracle PL_SQL语言初级教程

    PL/SQL 是一种高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令。 通过使用 PL/SQL 程序单元处理 SQL 的数据定义和数据控制元素。 • Oracle PL/SQL语言基础(1) • Oracle PL/SQL语言...

    oracle pl/sql 存储过程和函数与触发器

    oracle pl/sql 存储过程和函数与触发器

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

     第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件  第25章 开发多媒体应用  第26章 开发web应用  第27章 dbms_sq...

    Oracle10g_PL_SQL_编程讲义

    主要内容:PL/SQL 语言的基本特征、PL/SQL程序的结构、PL/SQL语言的控制结构、游标(cursor)编程、错误处理、存储过程和函数、创建包(Package)、触发器(Trigger)。

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件  第25章 开发多媒体应用  第26章 开发web应用  第27章 dbms_sq...

    Oracle_PLSQL_语法详细手册

    1. 转换函数: 12 2. 日期函数 16 3. 字符函数 20 4. 数值函数 28 5. 单行函数: 33 6. 多行函数 35 第二部分 PL/SQL语法部分 41 一、 PL/SQL语言简介 41 二、 变量说明 48 三、 PL/SQL控制程序流 52 四、 存储过程 54...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

     第19章PL/SQL函数  第20章PL/SQL包  第21章触发器  第22章使用对象类型 第四部分PL/SQL系统包  第23章使用大对象  第24章读写OS文件  第25章开发多媒体应用  第26章开发Web应用  第27章DBMS_SQ动态SQL  ...

    Oracle_PLSQL语言基础

    PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型  . PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有...

    Oracle重建WMSYS用户及WMSYS.WM_CONCAT函数

    简单来说,用PL/SQL执行下一下几个脚本就可以了。 特别要注意:PL/SQL登录时,要选择以sysdba的方式登录。同时用户要有dba的权限(如通过system用户给新用户分配权限:grant connect, resource, dba to scott) ...

    Oracle PL/SQL语言初级教程

    Oracle PL/SQL语言初级教程 1 目录 1 1.PL/SQL语言基础 3 过程 5 包(package) 6 变量和常量 6 执行部分 10 控制结构 12 小结 17 2.PL/SQL的复合数据类型 17 使用记录 19 PL/SQL集合 23 嵌套表 24 使用集合 25 集合的...

    Oracle PL SQL

    走进Oracle、认识PL/SQL、数据表的基本操作、表中数据的基本操作、数据的基本查询、查询中函数的使用、数据表的高级查询、索引及视图的使用、数据类型、流程控制、游标、存储过程和函数、触发器、异常处理、事务和锁...

Global site tag (gtag.js) - Google Analytics