PL/SQLPL/SQL过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PL/SQLPL/SQL过程相关的知识,希望对你有一定的参考价值。
一、子程序是一个程序单元/模块执行特定的任务。这些子程序被组合以形成更大的程序。这基本上是被称为“模块化设计”。子程序可以调用由另一个子程序或程序被称为调用程序。
子程序可以创建:
1.在模式层面
2.在包里面
3.在一个PL/SQL块内
1.模式级子程序是一个独立的子程序。它使用CREATE PROCEDURE或CREATE FUNCTION语句创建。它被存储在数据库中,并且可以使用DROP PROCEDURE或DROP FUNCTION语句被删除。
2.一个包内创建的一个子程序是一个封装子程序。它被存储在数据库中,仅当包被删除使用DROP PACKAGE语句可以被删除。
3.PL/SQL子程序被命名,可使用一组参数来调用PL/SQL块。 PL/SQL提供两种子程序:
函数:这些子程序返回一个值,主要用于计算并返回一个值。
过程:这些子程序没有直接返回值,主要用于执行操作。
二、PL/SQL子程序部分
每个PL/SQL子程序有一个名称,并且可以具有一个参数列表。就像匿名PL/SQL块,并命名块子程序也将有以下三个部分:
S.N. | 部分 & 描述 |
---|---|
1 | 声明部分 它是一个任选的组成部分。然而声明部分用于子程序并在开始时使用DECLARE关键字。它包含:类型,光标,常量,变量,异常和嵌套子程序声明。这些项局部于子程序和停止时,子程序完成执行完成前存在。 |
2 | 执行部分 这是一个强制性的一部分,包含执行指定操作语句 |
3 | 异常处理部分 这也是一个可选部分,它包含处理运行时错误的代码。 |
三、一创建过程
过程语句创建,语法如下:
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
< procedure_body >
END procedure_name;
这里,
procedure-name 指定的程序的名称
[OR REPLACE] 选项允许修改现有的程序
可选的参数列表中包含的名称,模式和类型的参数。IN表示该值将被从外部传递,OUT表示该参数将被用于从过程返回一个值到外面
procedure-body 包含可执行部分
AS关键字来代替了IS关键字用于创建一个独立的程序。
例子:
下面的示例创建一个字符串的简单过程执行时将‘Hello World!“显示在屏幕上。
CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
dbms_output.put_line(‘Hello World!‘);
END;
/
当上面的代码中使用SQL提示执行,它会产生以下结果:
Procedure created.
三、二执行独立程序
一个独立的程序可以有两种方式调用:
1.使用EXECUTE关键字
2.从PL/SQL块调用过程的名称
名为“greetings”的上述程序
1.程序可以调用EXECUTE关键字为:
EXECUTE greetings;
上述调用会显示:
Hello World
PL/SQL procedure successfully completed.
2.程序也可以从另一个PL/SQL块调用:
BEGIN
greetings;
END;
/
上述调用会显示:
Hello World
PL/SQL procedure successfully completed.
三、三删除独立程序
删除一个程序的语法是:
DROP PROCEDURE procedure-name;
下面的语句删除 greetings :
BEGIN
DROP PROCEDURE greetings;
END;
/
四、PL/SQL子程序参数模式
S.N. | 参数模式 & 描述 |
---|---|
1 | IN 一个IN参数传递一个值到子程序。它是一个只读的参数。内部的子程序,一个IN参数的作用就像一个常数。它不能再被分配值。 可以通过一个常量,文字,初始化变量或表达式作为一个IN参数。也可以把它初始化为默认值;然而,在这种情况下,它从子程序调用删去。这就是参数传递的默认模式。参数是通过引用传递。 |
2 | OUT OUT参数返回一个值到调用程序。在内部的子程序OUT参数就像一个变量。可以改变它的值并引用分配后的值。实际参数必须是变量,它是按值传递。 |
2 | IN OUT 一个IN OUT参数传递的初始值到一个子程序,并返回一个更新值给调用者。它可以被分配一个值,其值可被读取。 对应一个IN OUT形式参数的实际参数必须是一个变量,不是常量或表达式。形参必须分配一个值。实际参数就是按值传递。 |
IN & OUT 模式示例 1
该程序查找两个值中的最小值,这里过程使用IN模式接收两个数字,并使用OUT参数返回它们的最小值。
DECLARE a number; b number; c number; PROCEDURE findMin(x IN number, y IN number, z OUT number) IS BEGIN IF x < y THEN z:= x; ELSE z:= y; END IF; END; BEGIN a:= 23; b:= 45; findMin(a, b, c); dbms_output.put_line(‘ Minimum of (23, 45) : ‘ || c); END; / //当上述代码在SQL提示符执行时,它产生了以下结果: Minimum of (23, 45) : 23 PL/SQL procedure successfully completed.
IN & OUT 模式示例2
这个程序计算传递值的平方值。这个例子表明我们如何能够用相同的参数接受的值,然后返回另一个结果。
DECLARE a number; PROCEDURE squareNum(x IN OUT number) IS BEGIN x := x * x; END; BEGIN a:= 23; squareNum(a); dbms_output.put_line(‘ Square of (23): ‘ || a); END; / //当上述代码在SQL提示符执行时,它产生了以下结果: Square of (23): 529 PL/SQL procedure successfully completed.
五、方法传递参数
实际参数可以通过以下三种方式:
位置标记
命名符号
混合符号
1.位置表示法
在位置符号,可以调用的程序为:
findMin(a, b, c, d);
在位置表示法中,第一实际参数代入所述第一形式参数;第二实际参数代入所述第二形式参数,依此类推。那么,a取代x,b是取代为y,c为取代z以及d被代替m。
2.命名表示法
名为符号,实际参数与使用箭头符号的形式参数相关的(=>)。所以程序调用将如下所示:
findMin(x=>a, y=>b, z=>c, m=>d);
3.混合表示法
在混合符号表示法中,可以混合这两种写法过程调用;【但是,位置标记应先于指定符号】。
是合法的:findMin(a, b, c, m=>d);
但是,这样是不合法的:findMin(x=>a, b, c, d);
以上是关于PL/SQLPL/SQL过程的主要内容,如果未能解决你的问题,请参考以下文章
oracle(sql)基础篇系列——PLSQL游标存储过程触发器