PL / SQL程序
子程序是程序单元/模块执行特定的任务。这些子程序被组合以形成更大的程序。这基本上是被称为“模块化设计”。一个子程序可以由另一个子程序或程序被称为调用程序调用。
一个子程序可以创建:
在模式级
里面包
里面一个PL / SQL块
一个模式级子程序是一个独立的子程序 。它与CREATE PROCEDURE或CREATE FUNCTION语句创建的。它被存储在数据库中,并可以与DROP PROCEDURE或DROP FUNCTION语句被删除。
包内创建一个子程序是一个打包的子程序 。它被存储在数据库中,仅当包用DROP PACKAGE语句删除可以删除。我们将讨论在本章软件包的PL / SQL - 包“。
的PL / SQL子程序被命名为可以与一组参数被调用PL / SQL块。 PL / SQL提供两种子程序:
功能 :这些子程序返回一个值,主要用于计算并返回一个值。
程序 :这些子程序不直接返回,主要用于执行操作的值。
本章将介绍一个PL / SQL过程的重要方面,我们将覆盖下一章PL / SQL函数 。
一个PL / SQL子程序的零件
每个PL / SQL子程序有一个名称,并且可以具有一个参数列表。像匿名PL / SQL块,并命名块子程序也将有以下三个部分:
| SN | 零件与说明 |
|---|---|
| 1 | 声明部分 这是一个可选部分。然而,对于一个子程序声明部分不与DECLARE关键字开始。它包含的类型,游标,常量,变量,异常和子程序嵌套声明。这些项目是本地子程序和停止时,子程序完成执行存在。 |
| 2 | 可执行部分 这是一个强制性的一部分,包含执行指定的动作语句。 |
| 3 | 异常处理 这又是一个可选的部分。它包含处理运行时错误的代码。 |
创建过程
的过程是用CREATE OR REPLACE PROCEDURE语句创建的。为CREATE OR REPLACE PROCEDURE语句的简化的语法如下:
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
< procedure_body >
END procedure_name;
哪里,
程序-name指定过程的名称。
[OR REPLACE]选项允许修改现有的程序。
可选的参数列表包含名称,模式和类型的参数。在表示该值将来自外部的传递和OUT表示该参数将被用于该过程的外面返回一个值。
过程的主体部分包含可执行部分。
AS关键字来代替在IS关键字创建一个独立的过程。
例:
下面的示例创建一个显示字符串手续简单的'Hello World!“在屏幕上时执行。
CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
dbms_output.put_line('Hello World!');
END;
/
在上面的代码中使用SQL提示执行,会产生以下结果:
Procedure created.
执行一个独立的程序
一个独立的程序可以被称为在两个方面:
使用EXECUTE关键字
从PL / SQL块调用过程的名称
名为'问候'上面的过程可以用EXECUTE关键字作为被称为:
EXECUTE greetings;
以上调用将显示:
Hello World PL/SQL procedure successfully completed.
该程序还可以从其他PL / SQL块叫做:
BEGIN greetings; END; /
以上调用将显示:
Hello World PL/SQL procedure successfully completed.
删除独立程序
一个独立的过程是用DROP PROCEDURE语句删除。语法删除程序是:
DROP PROCEDURE procedure-name;
所以,你可以用下面的语句删除问候过程:
DROP PROCEDURE greetings;
在PL / SQL子程序参数模式
| SN | 参数模式和说明 |
|---|---|
| 1 | 在 一个IN参数让你传递一个值到子程序。 它是只读的参数 。子程序内,一个IN参数就像一个常数。它不能被分配的值。你可以通过一个常量,文字,初始化变量或表达式作为一个IN参数。你也可以把它初始化为默认值;然而,在这种情况下,它是从子程序调用被删去。 这是参数传递的默认模式。参数是通过引用传递。 |
| 2 | OUT OUT参数返回一个值给调用程序。子程序内部,一个OUT参数就像一个变量。你可以改变它的价值和分配后参考价值。 实际参数必须是变量,它是按值传递 。 |
| 2 | 进出 一个IN OUT参数传递初始值,一个子程序,并返回一个更新的值给调用者。它可以被分配一个值,并且可以读出其值。 对应一个IN OUT形式参数的实际参数必须是一个变量,而不是一个常量或表达式。形式参数必须赋值。 实际参数是按值传递。 |
IN&OUT模式示例1
该程序发现的最小的两个值,这里过程需要使用模式中的两个号码,并使用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.
传递参数的方法
实际参数可以通过三种方式进行传递:
位置表示法
命名符号
混合书写
位置表示法
在位置记号,可以调用的程序为:
findMin(a, b, c, d);
在位置记号,第一个实际参数取代了第一个正式的参数;第二个实际参数代替所述第二形式参数,依此类推。因此,一个被取代的为X,B代替Y,C为取代的对z和d被取代微米。
命名表示法
命名符号中,实际参数是用箭头符号的形式参数有关(=>)。因此,程序调用将如下所示:
findMin(x=>a, y=>b, z=>c, m=>d);
混合书写
在混合符号,你可以混合在程序调用这两个符号;但是,位置标记应先于指定的符号。
下面的调用是合法的:
findMin(a, b, c, m=>d);
但是,这是不合法的:
findMin(x=>a, b, c, d);