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(); SQL> execute :sal:=get_sal(); PL/SQL 过程已成功完成。 SQL> col sal for SQL> print sal; SAL
-------
1.2 使用本地变量获取结果
declare
sal number();
begin
sal := get_sal();
dbms_output.put_line('员工的工资:' || sal);
end;
2. 作为参数传递给另一个子程序
SQL> set serveroutput on
SQL> execute dbms_output.put_line(get_sal()); PL/SQL procedure successfully completed SQL> select get_sal() from dual;
GET_SAL()
------------
3. 在SQL语句中使用
SQL> select get_sal() from dual;
GET_SAL()
------------
四、用户定义的函数在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
Douglas
Jennifer
.......
Kevin
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
(, 'Frost', 'jfrost@company.com', SYSDATE, 'SA_MAN', sal);
return (sal+);
end;
在sql中调用这个函数:
SQL> update employees set salary=dml_call_sal() where employee_id=;
update employees set salary=dml_call_sal() where employee_id=
ORA-: 表 HR.EMPLOYEES 发生了变化, 触发器/函数不能读它
ORA-: 在 "HR.DML_CALL_SAL", line
七、查看函数的数据字典
以下视图可以查看函数的信息:
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 DML_CALL_SAL FUNCTION
begin DML_CALL_SAL FUNCTION
insert into employees(employee_id, last_name, email, hire_date, job_id, salary DML_CALL_SAL FUNCTION
VALUES DML_CALL_SAL FUNCTION
(, 'Frost', 'jfrost@company.com', SYSDATE, 'SA_MAN', sal); DML_CALL_SAL FUNCTION
return (sal+); DML_CALL_SAL FUNCTION
end; DML_CALL_SAL FUNCTION
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(*)
---------- 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(*)
---------- conn hr/hr select count(*) from e; COUNT(*)
----------
ORACLE函数详解【weber出品】的更多相关文章
- oracle函数详解-转
1.SQL 语句基础 下面给出SQL语句的基本介绍. 1.1.SQL语句所用符号 操作符 用途 例子 + - 表示正数或负数,正数可省去 + -1234.56 + 将两个数或表达式进行相加 A=c+b ...
- Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt
PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...
- Oracle中的substr()函数 详解及应用
注:本文来源于<Oracle中的substr()函数 详解及应用> 1)substr函数格式 (俗称:字符截取函数) 格式1: substr(string string, int a, ...
- oracle 数据类型详解---日期型(转载)
oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...
- oracle rowid 详解
oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...
- Oracle索引详解
Oracle索引详解(二) --索引分类 Oracle 提供了大量索引选项.知道在给定条件下使用哪个选项对于一个程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程 ...
- Oracle date 详解
oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享:注:由于INTERV ...
- 【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. ...
- 问题: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 创 ...
随机推荐
- c++回调实现
回调是A将一个函数指针传给B,然后调用B,B在执行自身函数后,再在合适的时候执行A的这个函数指针,这样就能避免A和B的相互包含和链接,在大型项目中回调是一种打破循环依赖的常用技术. typedef v ...
- android手机获取手机号
最近做到一个项目,需要获取手机号.项目中使用的手机卡为电信卡,那么就以此为例吧. 网上不符合需求的方法 Google了一下,网上的做法如下: //获取手机号码 TelephonyManager tm ...
- Arduino 板子 COM 接口找不到设备
复位 Arduino 板子 1.打开官方的blink程序. 2.重新拔插usb. 3.点下载. 4.按住左上角的复位按键不放. 5.等显示开始下载瞬间松开按键.把握住那个瞬间. 6.多试验几次看能 ...
- 类和对象:继承 - 零基础入门学习Python038
类和对象:继承 让编程改变世界 Change the world by program 上节课的课后作业不知道大家完成的怎样?我们试图模拟一个场景,里边有一只乌龟和十条鱼,乌龟通过吃鱼来补充体力,当乌 ...
- 使用laravel的任务调度(定时执行任务)
laravel中有一个很强大上的功能,只需要在服务器上添加一个cron条目,就可以定时执行所有的laravel任务. 现在有如下数据表: 我想让cron表中的cron字段的值每分钟增加1,那么我需要如 ...
- matlab的绘图保存
matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的.Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工 ...
- Linux/Unix工具与正则表达式的POSIX规范
http://www.infoq.com/cn/news/2011/07/regular-expressions-6-POSIX 对正则表达式有基本了解的读者,一定不会陌生『\d』.『[a-z]+』之 ...
- qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用
原则上,两者是不可以同时存在的,但是如果都安装了,该如何分别使用他们呢? Qt4 Visual Studio Add-in:官网可以下载安装程序,qt-vs-addin-1.1.11-opensour ...
- 代理模式 - OK
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式的优点: ...
- PowerShell 简单模式识别 1
PowerShell 简单模式识别 1 10 6月, 2013 在 Powershell tagged 字符串 / 文本 / 通配符 by Mooser Lee 在验证用户的条目时,模式识别是必要并 ...