📅  最后修改于: 2020-11-26 05:55:36             🧑  作者: Mango
在本章中,我们将讨论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块一样,命名块也将具有以下三个部分-
S.No | Parts & Description |
---|---|
1 |
Declarative Part It is an optional part. However, the declarative part for a subprogram does not start with the DECLARE keyword. It contains declarations of types, cursors, constants, variables, exceptions, and nested subprograms. These items are local to the subprogram and cease to exist when the subprogram completes execution. |
2 |
Executable Part This is a mandatory part and contains statements that perform the designated action. |
3 |
Exception-handling This is again an optional part. It contains the code that handles run-time errors. |
使用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;
哪里,
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.
一个独立的过程可以通过两种方式调用-
使用EXECUTE关键字
从PL / SQL块中调用过程的名称
可以使用EXECUTE关键字将上述名为“ greetings”的过程称为-
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子程序中的参数模式-
S.No | Parameter Mode & Description |
---|---|
1 |
IN An IN parameter lets you pass a value to the subprogram. It is a read-only parameter. Inside the subprogram, an IN parameter acts like a constant. It cannot be assigned a value. You can pass a constant, literal, initialized variable, or expression as an IN parameter. You can also initialize it to a default value; however, in that case, it is omitted from the subprogram call. It is the default mode of parameter passing. Parameters are passed by reference. |
2 |
OUT An OUT parameter returns a value to the calling program. Inside the subprogram, an OUT parameter acts like a variable. You can change its value and reference the value after assigning it. The actual parameter must be variable and it is passed by value. |
3 |
IN OUT An IN OUT parameter passes an initial value to a subprogram and returns an updated value to the caller. It can be assigned a value and the value can be read. The actual parameter corresponding to an IN OUT formal parameter must be a variable, not a constant or an expression. Formal parameter must be assigned a value. Actual parameter is passed by value. |
该程序找到两个值中的最小值。在此,该过程使用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.
此过程计算传递的值的平方值。此示例说明了如何使用相同的参数来接受值,然后返回另一个结果。
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);
在位置表示法中,第一个实际参数代替第一个形式参数;第二个实际参数代替第二个形式参数,依此类推。因此, a替代x,b替代y,c替代z , d替代m 。
在命名符号中,实际参数与使用箭头符号(=>)的形式参数相关联。过程调用将类似于以下内容-
findMin(x => a, y => b, z => c, m => d);
在混合表示法中,您可以在过程调用中混合使用两种表示法。但是,位置符号应在命名符号之前。
以下电话是合法的-
findMin(a, b, c, m => d);
但是,这是不合法的:
findMin(x => a, b, c, d);