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
函数名称;
分享到:
相关推荐
java调用oracle存储过程或者函数
Oracle过程和函数相信大家都比较了解,下面就为您详细介绍Oracle过程和函数二者之间的区别,希望可以让您对Oracle过程和函数有更深的认识。 Oracle过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也...
oracle 存储过程 函数 dblink 绝对对工作和平时学习有价值的资料。针对个人具体情况做修改即可使用
Oracle数据库存储过程、函数、以及包的创建与高级应用。
里面包含了oracle中最基本的函数和存储过程的例子,可咦更加直观的学好函数和存储过程
oracle 函数 oracle函数 存储过程
oracle笔记存储函数和存储过程,有具体的代码案例!存储函数和存储过程的知识笔记!
Oracle实验报告
Oracle存储过程和函数(最详细包含emp 表实例操作,边看边操作),目前最详细的存储过程文档,不好你举报我。含好多ORACLE SCOTT中emp表的实例。
oracle存储过程函数生成DEMO
ORACLE过程和函数--思远教育
Oracle中的函数、存储过程、包. 函数 ①系统函数 ②自定义函数 ③使用函数 ④编写过程 ⑤过程的调用
oracle 的存储过程和函数的语法 如下
你还在为如何调用oracle中的存储过程和函数而烦恼吗,请看看该文档。
oracle存储过程与函数,oracle用的很广泛,其中的存储过程是必须的
讲解了oracle的编程存储过程、函数和包
oracle函数调用存储过程.doc
Oracle存储过程、游标、函数的详解
oracle函数与过程
本文档详细介绍了如何在Oracle数据库中实现像C#等其它编程语言中Split函数来拆分字符的功能。例子简单易懂,并附有详细的实现过程。