ORACLE函数详解【weber出品】

一、什么是函数

一个函数:

1. 是命名的PL/SQL块,必须返回一个值

2. 可以存储到数据库中重复执行

3. 可以作为表达式的一部分或者提供一个参数值

二、创建函数的语法

必须至少有一个返回值,创建模板:

CREATE [OR REPLACE] FUNCTION function_name [(parameter1 [mode1] datatype1, ...)]
RETURN datatype IS|AS
 [local_variable_declarations; …]
BEGIN  -- actions;
  RETURN expression;
END [function_name];

创建函数示例:

create or replace function get_sal(v_employee_id employees.employee_id%type)
  return number is
  v_salary employees.salary%type;
begin
  select salary
    into v_salary
    from employees
   where employee_id = v_employee_id;
  return v_salary;
end;

三、执行函数的方式:

1. 作为表达式的一部分调用

1.1 使用主机变量获取结果

SQL> conn hr/hr

SQL> variable sal number(6);

SQL> execute :sal:=get_sal(100);

PL/SQL 过程已成功完成。

SQL> col sal for 999999

SQL> print sal;

    SAL
-------
  24000

1.2 使用本地变量获取结果

declare
  sal number(6);
begin
  sal := get_sal(100);
  dbms_output.put_line(‘员工的工资:‘ || sal);
end;

2. 作为参数传递给另一个子程序

SQL> set serveroutput on
SQL> execute dbms_output.put_line(get_sal(100));
24000
PL/SQL procedure successfully completed

SQL> select get_sal(100) from dual;
GET_SAL(100)
------------
       24000

3. 在SQL语句中使用

SQL> select get_sal(100) from dual;
GET_SAL(100)
------------
       24000

四、用户定义的函数在SQL语句中的优势

函数:

1. oracle自定义的函数

2. 用户自定义的函数

优势:

1. 在SQL无法使用的时候,可以扩展SQL语句

2. 在WHERE子句中用来过滤数据时,可以提高过滤数据的效率

3. 可以操作数据

在SQL表达式中使用函数: 示例

create or replace function tax(value employees.salary%type) return number is
begin
  return(value * 0.08);
end;
SQL> select first_name,tax(salary) from employees;
FIRST_NAME           TAX(SALARY)
-------------------- -----------
Donald                       208
Douglas                      208
Jennifer                     352
             .......
Kevin                        240
107 rows selected

五、用户定义函数的调用位置

用户定义的函数与内置的单行函数一样,可以用于:

1. SELECT列表

2. WHERE和HAVING子句的条件表达式

3. 查询语句的CONNECT BY, START WITH, ORDER BY, GROUP BY ,INSERT语句的VALUE子句、UPDATE语句的SET子句

六、在SQL表达式中调用函数的限制

在SQL表达式中调用函数的限制:

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

2. 在SQL语句中调用的函数只能带有输入参数(IN),而不能带有输出参数(OUT)和输入输出参数(INOUT)

3. 在SQL语句中调用的函数只能使用SQL所支持的标准数据类型,而不能使用PL/SQL的特有数据类型(例如BOOLEAN,TABLE和RECORD等)

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

我们来验证第四条:

create or replace function dml_call_sal(sal number) return number is
begin
  insert into employees(employee_id, last_name, email, hire_date, job_id, salary)
  VALUES
    (1, ‘Frost‘, ‘[email protected]‘, SYSDATE, ‘SA_MAN‘, sal);
return (sal+100);
 end;
在sql中调用这个函数:SQL> update employees set salary=dml_call_sal(2000) where employee_id=107;
update employees set salary=dml_call_sal(2000) where employee_id=107
ORA-04091: 表 HR.EMPLOYEES 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "HR.DML_CALL_SAL", line 3

七、查看函数的数据字典

以下视图可以查看函数的信息:

USER_SOURCE 

ALL_SOURCE

DBA_SOURCE

SELECT text
FROM   user_source
WHERE  type = ‘FUNCTION‘
and    name =‘DML_CALL_SAL‘
ORDER BY line; 

使用USER_OBJECTS查看类型为FUNCTION的对象名

SELECT object_name
FROM   user_objects
WHERE  object_type = ‘FUNCTION‘;

SQL> select object_name from user_objects where object_type=‘FUNCTION‘;
OBJECT_NAME
--------------------------------------------------------------------------------
GET_SAL
TAX
DML_CALL_SAL

使用USER_SOURCE查看函数的内容

SQL> select text,line,name ,type from user_source where type=‘FUNCTION‘ and name=‘DML_CALL_SAL‘;
TEXT                                                                                   LINE NAME                           TYPE
-------------------------------------------------------------------------------- ---------- ------------------------------ ------------
function dml_call_sal(sal number) return number is                                        1 DML_CALL_SAL                   FUNCTION
begin                                                                                     2 DML_CALL_SAL                   FUNCTION
  insert into employees(employee_id, last_name, email, hire_date, job_id, salary          3 DML_CALL_SAL                   FUNCTION
  VALUES                                                                                  4 DML_CALL_SAL                   FUNCTION
    (1, ‘Frost‘, ‘[email protected]‘, SYSDATE, ‘SA_MAN‘, sal);                           5 DML_CALL_SAL                   FUNCTION
return (sal+100);                                                                         6 DML_CALL_SAL                   FUNCTION
 end;                                                                                     7 DML_CALL_SAL                   FUNCTION
7 rows selected

八、过程与函数对比

九、删除函数

删除函数:

语法: DROP FUNCTION function_name

示例:DROP FUNCTION get_sal;

当函数被删除以后,在函数的所有权限都被删除

The CREATE OR REPLACE 语法等于先删除函数,燃烧再创建,权限仍然被保留

十、权限

1. 定义者权限(default)

SQL> conn hr/hr
Connected.
SQL> create table e as select * from employees;

Table created.

SQL> select count(*) from e;

  COUNT(*)
----------
       107

SQL> conn scott/tiger;
Connected.

SQL> create table e as select * from emp;


Table created.


SQL> select count(*) from e;


COUNT(*)
----------
14


SQL> conn hr/hr;
Connected.
SQL> create or replace procedure insert_e is
2 begin
3 insert into e select * from e;
4 commit;
5 end;
6 /


Procedure created.


SQL> show user
USER is "HR"

SQL> grant execute on insert_e to scott;

Grant succeeded.

SQL> conn scott/tiger
Connected.
SQL> select count(*) from e;

COUNT(*)
----------
14

SQL> conn hr/hr;
Connected.
SQL> select count(*) from e;

COUNT(*)
----------
107

SQL> conn scott/tiger;
Connected.

SQL> execute hr.insert_e;

PL/SQL procedure successfully completed.

SQL> conn hr/hr
Connected.
SQL> select count(*) from e;

COUNT(*)
----------
214

2. 调用者权限

默认情况,程序以其拥有者身份(定义者)执行。定义者权限的程序与其所在模式绑定,调用对象不需要加上模式完整名称。例如,假如模式HR和OE都有deparments表,HR拥有的程序可直接调用departments而不用HR.departments.而如果OE调用HR的程序,程序仍然调用的是HR的departments.

如果希望不同模式(schema)调用相同的程序却可以操作各自拥有的对象,就可以在定义程序的时候加上AUTHID CURRENT_USER。

conn hr/hr

create or replace procedure insert_e authid current_user is
begin
  insert into e select * from e;
  commit;
end;

grant execute on insert_e to scott;

conn scott/tiger

execute insert_e;

select count(*) from e;

  COUNT(*)
----------
        28

conn hr/hr

select count(*) from e;

  COUNT(*)
----------
       214
时间: 2024-08-01 18:51:22

ORACLE函数详解【weber出品】的相关文章

oracle函数详解

Oracle 数据库中 SQL 分析的主要优势 Oracle 数据库中分析功能和特性提供以下主要优势: 1. 提高开发人员产能 — 开发人员可以通过更清晰.更简洁的 SQL 代码执行复杂分析.现在可以使用一条 SQL 语句表示复杂任务,编写和维护速度更快.效率更高. 2. 提高查询速度 — 数据库中分析支持的处理优化可大幅提高查询性能.以前需要自联接或复杂过程处理的操作现在可以用原生 SQL 执行. 3. 改善可管理性 — 应用程序共享一个公共的关系环境,而非数据结构不兼容的计算引擎组合,因此可

ORACLE函数之GREATEST函数详解实例

1           语法 GREATEST(expr_1, expr_2, ...expr_n) 2           说明 GREATEST(expr_1, expr_2, ...expr_n)函数从表达式(列.常量.计算值)expr_1, expr_2, ... expr_n等中找出最大的数返回.在比较时,OracIe会自动按表达式的数据类型进行比较,以expr_1的数据类型为准. 3    允许使用的位置 过程性语句和SQL语句. 4           示例 4.1        

Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 组函数 本文将讨论如何利用单行函数以及使用规则. SQL中的单行函数 SQL和PL/SQL中自带很多类型的函数,有字符.数字.日期.转换.和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数.这些函数均可用于SELECT,WHERE.ORDER BY等子句中,例如下面的例子中就包含了TO

【Oracle】详解Oracle常用函数

Oracle SQL 提供了用于执行特定操作的专用函数.这些函数大大增强了 SQL 语言的功能.函数可以接受零个或者多个输入参数,并返回一个输出结果. Oracle 数据库中主要使用两种类型的函数: 1.  单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果, 比如:MOD(x,y)返回 x 除以 y 的余数(x 和 y 可以是两个整数,也可以是表中的整 数列).常用的单行函数有: Ø  字符函数:对字符串操作. Ø  数字函数:对数字进行计算,返回一个数字. Ø  转换函

Oracle中的substr()函数 详解及应用

注:本文来源于<Oracle中的substr()函数 详解及应用> 1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a) ; 解释: 格式1:        1.string 需要截取的字符串         2.a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)        3.b 要截取的字符串的长度 格式2:     

Oracle ROWID详解

1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包含以下信息: 对象的数据对象编号 该行所在的数据文件中的数据块 该行中数据块的位置(第一行是0) 数据行所在的数据文件(第一个文件是1).该文件编号是相对于表空间. 通常来说,一个rowid值唯一标识数据中的一行.然而,存储在同一聚簇中不同的表可以有相同的rowid. 2.扩展ROWID 从Oracle 8i开始使用扩展rowid标识行物理地址 扩展rowid使用base6

问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例

ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系

Oracle索引详解

Oracle索引详解(一) ### --索引介绍 ??索引对于Oracle学习来说,非常重要,在数据量巨大的状况下,使用恰到好处的索引,将会使得数据查询时间大大减少,于2017/12/25暂时对Oracle中的索引进行一个大致的了解. 索引的创建语法 索引的特点 索引的不足 比较适合建立索引的列的特点 不适合建立索引的列的特点 限制索引(建立了索引,但是无法使用) 查询索引 组合索引 Oracle rowid 选择性 群集因子 二元高度 快速全表扫描 跳跃式扫描 索引的创建语法 create o

ORACLE存储过程详解

ORACLE存储过程详解 1.定义 所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作. 2.存储过程的创建 Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常. (1)无参存储过程语法 1 2 3 4 5 6 7 8 create or replace procedure