一、什么是函数

一个函数:

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

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

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

二、创建函数的语法

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

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

创建函数示例:

  1. create or replace function get_sal(v_employee_id employees.employee_id%type)
  2. return number is
  3. v_salary employees.salary%type;
  4. begin
  5. select salary
  6. into v_salary
  7. from employees
  8. where employee_id = v_employee_id;
  9. return v_salary;
  10. end;

三、执行函数的方式:

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

1.1 使用主机变量获取结果

  1. SQL> conn hr/hr
  2.  
  3. SQL> variable sal number();
  4.  
  5. SQL> execute :sal:=get_sal();
  6.  
  7. PL/SQL 过程已成功完成。
  8.  
  9. SQL> col sal for
  10.  
  11. SQL> print sal;
  12.  
  13. SAL
  14. -------

1.2 使用本地变量获取结果

  1. declare
  2. sal number();
  3. begin
  4. sal := get_sal();
  5. dbms_output.put_line('员工的工资:' || sal);
  6. end;

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

  1. SQL> set serveroutput on
  2. SQL> execute dbms_output.put_line(get_sal());
  3.  
  4. PL/SQL procedure successfully completed
  5.  
  6. SQL> select get_sal() from dual;
  7. GET_SAL()
  8. ------------

3. 在SQL语句中使用

  1. SQL> select get_sal() from dual;
  2. GET_SAL()
  3. ------------

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

函数:

1. oracle自定义的函数

2. 用户自定义的函数

优势:

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

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

3. 可以操作数据

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

  1. create or replace function tax(value employees.salary%type) return number is
  2. begin
  3. return(value * 0.08);
  4. end;
  1. SQL> select first_name,tax(salary) from employees;
  2. FIRST_NAME TAX(SALARY)
  3. -------------------- -----------
  4. Donald
  5. Douglas
  6. Jennifer
  7. .......
  8. Kevin
  9. 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语句

我们来验证第四条:

  1. create or replace function dml_call_sal(sal number) return number is
  2. begin
  3. insert into employees(employee_id, last_name, email, hire_date, job_id, salary)
  4. VALUES
  5. (, 'Frost', 'jfrost@company.com', SYSDATE, 'SA_MAN', sal);
  6. return (sal+);
  7. end;
  1. sql中调用这个函数:
    SQL> update employees set salary=dml_call_sal() where employee_id=;
  2. update employees set salary=dml_call_sal() where employee_id=
  3. ORA-: HR.EMPLOYEES 发生了变化, 触发器/函数不能读它
  4. ORA-: "HR.DML_CALL_SAL", line

七、查看函数的数据字典

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

  1. USER_SOURCE
  2.  
  3. ALL_SOURCE
  4.  
  5. DBA_SOURCE
  6.  
  7. SELECT text
  8. FROM user_source
  9. WHERE type = 'FUNCTION'
  10. and name ='DML_CALL_SAL'
  11. ORDER BY line;

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

  1. SELECT object_name
  2. FROM user_objects
  3. 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查看函数的内容

  1. SQL> select text,line,name ,type from user_source where type='FUNCTION' and name='DML_CALL_SAL';
  2. TEXT LINE NAME TYPE
  3. -------------------------------------------------------------------------------- ---------- ------------------------------ ------------
  4. function dml_call_sal(sal number) return number is DML_CALL_SAL FUNCTION
  5. begin DML_CALL_SAL FUNCTION
  6. insert into employees(employee_id, last_name, email, hire_date, job_id, salary DML_CALL_SAL FUNCTION
  7. VALUES DML_CALL_SAL FUNCTION
  8. (, 'Frost', 'jfrost@company.com', SYSDATE, 'SA_MAN', sal); DML_CALL_SAL FUNCTION
  9. return (sal+); DML_CALL_SAL FUNCTION
  10. end; DML_CALL_SAL FUNCTION
  11. rows selected

八、过程与函数对比

九、删除函数

删除函数:

  1. 语法: DROP FUNCTION function_name
  2.  
  3. 示例:DROP FUNCTION get_sal;

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

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

十、权限

1. 定义者权限(default)

  1. SQL> conn hr/hr
  2. Connected.
  3. SQL> create table e as select * from employees;
  4.  
  5. Table created.
  6.  
  7. SQL> select count(*) from e;
  8.  
  9. COUNT(*)
  10. ----------
  11.  
  12. SQL> conn scott/tiger;
  13. Connected.

SQL> create table e as select * from emp;

  1.  

Table created.

  1.  

SQL> select count(*) from e;

  1.  

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

  1.  

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 /

  1.  

Procedure created.

  1.  

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。

  1. conn hr/hr
  2.  
  3. create or replace procedure insert_e authid current_user is
  4. begin
  5. insert into e select * from e;
  6. commit;
  7. end;
  8.  
  9. grant execute on insert_e to scott;
  10.  
  11. conn scott/tiger
  12.  
  13. execute insert_e;
  14.  
  15. select count(*) from e;
  16.  
  17. COUNT(*)
  18. ----------
  19.  
  20. conn hr/hr
  21.  
  22. select count(*) from e;
  23.  
  24. COUNT(*)
  25. ----------

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

  1. oracle函数详解-转

    1.SQL 语句基础 下面给出SQL语句的基本介绍. 1.1.SQL语句所用符号 操作符 用途 例子 + - 表示正数或负数,正数可省去 + -1234.56 + 将两个数或表达式进行相加 A=c+b ...

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

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

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

    注:本文来源于<Oracle中的substr()函数 详解及应用> 1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, ...

  4. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  5. oracle rowid 详解

    oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...

  6. Oracle索引详解

    Oracle索引详解(二) --索引分类   Oracle 提供了大量索引选项.知道在给定条件下使用哪个选项对于一个程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程 ...

  7. Oracle date 详解

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享:注:由于INTERV ...

  8. 【Oracle】详解ORACLE中的trigger(触发器)

    本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...

  9. 问题: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 创 ...

随机推荐

  1. ORACLE的order by中文排序

    在使用order by排序的时候,出现如下情况:   印象中中文排序应该默认是按照拼音排序的,为何"鑫"会排在"中"的后面呢?猜想order by是不是根据对应 ...

  2. C#double保留两位小数

    public static void Main(string[] args) { double db = Math.PI; db = Math.Round(db,); Console.WriteLin ...

  3. 模板模式(Template)

    行为型:Template(模板模式) 作为一个曾经爱好写文章,但是不太懂得写文章的人,我必须承认,开头是个比较难的起步. 模板模式常规定义:模板模式定义了一个算法步骤,把实现延迟到子类. 事实上模板模 ...

  4. Reshaper 快捷键

    配置单个键盘快捷键 1.在主菜单上,选择Tools | Options 2.在导航视图中选择Environment | Keyboard 3.在命令列表中,选择启动ReSharper的命令名称.浏览列 ...

  5. data语意学

    引例: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; ...

  6. CM源码同步编译教程

    一.操作系统 准备一个ubuntu安装镜像,我用的是12.10. 安装系统时请安装到30g以上的盘,最好就50g以上啦 安装教程不多说,网上很多教程,这里我推荐用自带的wubi工具安装,比较方便 用虚 ...

  7. KEIL 伪指令

    //为了大家查找方便,命令按字母排序:0.ALTNAME 功能: 这一伪指令用来自定义名字,以替换源程序中原来的保留字,替换的保留字均可等效地用于子程序中. 格式: ALTNAME 保留字 自定义名 ...

  8. 常用的Windows批处理

      切换执行路径 如果不换盘的话:cd xxx换盘:cd /d xxx   获取当前日期 编写Windows批处理时经常会需要使用到日期和时间作为文件名,所以是非常重要的. 如何获取日期呢?格式:  ...

  9. java decompiler如何去掉行号

    今天想反编译jar包保存源代码,默认前面加了行号,不知道这个小工具如何设置去掉行号? 反编译后: 找到它的安装路径,我的是:C:\Program Files\decomp.然后将该路径加入到环境变量p ...

  10. bzoj 1192

    http://www.lydsy.com/JudgeOnline/problem.php?id=1192 好像学过一个东西: [0..2^(N+1)-1]内的数都的都可以由2^0,2^1,...,2^ ...