Oracle 的过程与函数
一、过程
1 、过程创建和调用
过程 (procedure) 是一个 PL/SQL 语句块,它存储在数据字典中并可被应用程序调用。可以使用过程存储数据库中频繁使用的应用逻辑。当执行一个过程时,其语句被作为一个整体执行。过程不将任何值返回调用程序。
使用存储过程的一个好处就是能够实施数据的安全性。可以使不授权用户直接访问应用程序中的一些表,而授权用户执行访问这些表的一个过程。当执行过程时,他将以过程拥有者的权限来执行。除非通过过程,否则用户就不能访问这些表。
创建过程语句的语法如下 :
CREATE [OR REPLACE] PROCEDURE 过程名称
[( 参数 [{IN | OUT | IN OUT}] 类型,
…
参数 [{IN | OUT | IN OUT}] 类型 )]
[AUTHID {CURRENT_USER | DESIGNER}]
{IS | AS}
过程体
在 CREATE 关键字后加上 OR REPLACE 关键字是为了允许将撤销和重建这两步操作合并为一个操作。因为在创建一个过程时,有可能这个过程已存在。为了修改过程的代码,首先必须将该过程撤销,然后再重建。由于这种操作已经是开发过程的标准方式,所以关键字 OR REPLACE 允许将撤销和重建这两步操作合并为一个操作。
和其他的 CREATE 语句一样,创建过程是一种 DDL 操作。
在过程和函数中没有使用关键字 DECLARE ,取而代之的是关键字 IS 或 AS 。这种语法风格是 PL/SQL 从 Ada 语言中继承下来的。
综上所述,过程的结构应具有下面所示的特征 :
CREATE OR REPLACE PROCEDURE 过程名称 [ 参数列 ] AS
/* 声明部分在这里 */
BEGIN
/* 可执行部分在这里 */
EXCEPTION
/* 异常部分在这里 */
END [ 过程名称 ];
过程名可以写在过程声明中最后一个 END 语句之后。如果在该 END 语句之后有标识符,该标识符一定要与该过程名匹配。
下面给出一个创建过程的简单例子,用于打印当前时间 。
CREATE OR REPLACE PROCEDURE print_current_time AS
CURTIME VARCHAR2(20);
BEGIN
SELECT TO_CHAR(sysdate, ‘yyyy/mm/dd hh24:mi:ss’)
INTO CURTIME
FROM dual;
DBMS_OUTPUT.put_line(‘ 当前时间 : ’||CHR(9)||CURTIME);
END print_current_time;
/
在 PL/SQL 中,调用过程有以下两种方式 。
* 直接利用 EXECUTE 命令
EXECUTE print_current_time;
* 在 PL/SQL 块中调用
declare
begin
print_current_time;
end;
2 、过程参数设置与传递
下面是一个带参数过程的简单例子。
CREATE OR REPLACE PROCEDURE print_parameter
(param1 IN VARCHAR2 DEFAULT NULL) AS
BEGIN
IF (param1 IS NULL) THEN
DBMS_OUTPUT.put_line(‘ 你没输入参数 ’);
ELSE
DBMS_OUTPUT.put_line(‘ 你输入的参数是: ’||CHR(9)||param1);
END IF;
END print_parameter;
形参可以有 3 种模式 : IN 、 OUT 或 IN OUT 。如果没有为形参指定模式,其默认模式为 IN 。
IN :该值具有只读属性,不能对其修改。当该过程结束时,控制将返回到调用环境,这时,对应的实参没有改变。
OUT :该变量具有读写属性。当该过程结束时,控制将返回调用环境,形参的内容将被赋予对应的实参。
IN OUT :该模式是模式 IN 和 OUT 的组合。调用过程时,实参的值将被传递到该过程中。在过程内部,形参相当于初始化的变量,并具有读写属性。当该过程结束时,控制将返回调用环境中,形参的内容将被赋予实参。
在过程的声明中,不能强制指定参数 CHAR 和 VARCHAR2 的长度,以及指定 NUMBER 参数的精度或小数点后倍数。这样是非法的,因为这些限制可以从实参中获得。
PL/SQL 的默认方式是对参数 IN 执行按引用传递,而对参数 OUT 、 IN OUT 执行按值传递。另外,使用 NOCOPY 编译器将按引用传递参数,而不是按值传递。
二、函数的创建、查询和调用
与过程一样,函数也带有参数,是存储在数据库中的代码块。其差别在于函数可以把值返回调用程序,可以在 SQL 语句中调用它们。一般的调用方式是:过程调用本身是一个 PL/SQL 语句,而函数调用是作为表达式的一部分执行的。
语法如下:
CREATE [OR REPLACE] FUNCTION 函数名称
[( 参数 [{IN | OUT | IN OUT}] 数据类型,
…
参数 [{IN | OUT | IN OUT}] 数据类型 )]
[AUTHID {CURRENT_USER | DESIGNER}]
{IS | AS}
函数体
返回语句: RETURN 返回值
当执行该语句时,如果表达式的类型与定义不符,该表达式将被转换为函数定义子句 RETURN 中指定的类型。
创建一个函数,确定一个数是奇数还是偶数。
CREATE OR REPLACE FUNCTION EVEN_ODD
(p_Number IN NUMBER)
RETURN VARCHAR2 IS
RETVAL VARCHAR2(5);
BEGIN
IF (p_Number MOD 2) = 0 THEN
RETVAL:=’EVEN’;
ELSE
RETVAL:=’ODD’;
END IF;
RETURN RETVAL;
END EVEN_ODD;
/
可以用 SELECT 语句进行查询:
SELECT EVEN_ODD(29) FROM DUAL;
对函数的调用一般在作为表达式的那部分进行,如:
DBMS_OUTPUT.put_line(EVEN_ODD(a_number));
三、删除过程和函数
DROP PROCEDURE 过程名称;
DROP FUNCTION 函数名称;
Oracle 的过程与函数的更多相关文章
- 逆袭之旅DAY17.东软实训.Oracle.PLSQL.过程,函数,包,练习
2018-07-13 14:54:46 --1.创建一个包,包含一个为雇员加薪的过程,一个为雇员减薪的过程 CREATE OR REPLACE PACKAGE pac_test1 IS PROCEDU ...
- Oracle过程及函数的参数模式,In、out、in out模式
Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...
- Oracle过程及函数的参数模式详解
一.In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: (1)in模式 in模式是引用传 ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- 关于Oracle过程,函数的经典例子及解析
一,Oracle中的过程,函数 对于oracle中的过程和函数,个人觉得可以化为一类,因为它们在写法上并没有什么的不同.公式无非就是 create or replace Package_name(pa ...
- Oracle数据库之PL/SQL过程与函数
Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- oracle数据库之存储函数和过程
一.引言 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块 ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
随机推荐
- HDP2.4安装(二):Centos7配置
Centos7 Minimal Install 安装完成后是不支持上网的,并且大部分常用的软件也未安装,首先要解决的问题就是网络配置.当网络配通后,即可通过Xshell或其它工具来远程进行操作与管理, ...
- Subversion与TortoiseSVN的安装
首先介绍一下Subversion与TortoiseSVN两者之间的关系: Subversion是一种集中分享信息的系统,它的核心是版本库,储存所有的数据.版本库按照文件树形式储存数据-包括文件和目录. ...
- LintCode "Subarray Sum II"
Sliding window doesn't work. So it is a typical partial_sum base solution. As below. However if you ...
- 高性能MySQL --- 读书笔记(1) - 2016/8/2
此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...
- 51nod 1297 管理二叉树
一个初始为空的二叉搜索树T,以及1到N的一个排列P: {a1, a2, ..., aN}.我们向这个二叉搜索树T添加这些数,从a1开始, 接下来是 a2, ..., 以aN结束.在每一个添加操作后,输 ...
- Linux开机自动挂载存储
今天有个系统的开发人员跟我说,他们测试系统出现问题重启了服务器后就发现找不到存储了. 唉,不用说了.肯定没有自动加载存储呗.一个堂堂的技术顾问,一天4-5K工资的人连这个操作都不会啊?忍了... 登录 ...
- ASP.NET动态加载Js代码到Head标签中(三种方法)
方法一代码如下: HtmlGenericControl Include2 = new HtmlGenericControl("script"); Include2.Attribut ...
- 【SQL Server】系统学习之一:表表达式
本节讨论的相关内容包括:视图.派生表.CTE.内联表值函数 场景:如果要查询一组数据(例如聚合数据,也就是几个表聚合在一起的数据),这些数据并未在数据库中以表的形式存在. 1.视图:通常用来分解大型的 ...
- Javascript金额转化
//"123,456.78"----> 123456.78(float格式) function rmoney(s) { return parseFloat(s.replace ...
- Maven打包web工程成WAR
其实不一定要通过Goals:package来打war包,直接run as maven bulid也行: