PL/SQL - 过程
-
简述
在本章中,我们将讨论 PL/SQL 中的过程。一种子程序是执行特定任务的程序单元/模块。这些子程序组合成更大的程序。这基本上被称为“模块化设计”。一个子程序可以被另一个子程序或程序调用calling program.可以创建子程序 -- 在架构级别
- 包内
- 在 PL/SQL 块中
在模式级别,子程序是一个 standalone 子程序. 它是使用 CREATE PROCEDURE 或 CREATE FUNCTION 语句创建的。它存储在数据库中,可以使用 DROP PROCEDURE 或 DROP FUNCTION 语句删除。在包内创建的子程序是 packaged 子程序. 它存储在数据库中,只有在使用 DROP PACKAGE 语句删除包时才能删除。我们将在本章讨论包'PL/SQL - Packages'.PL/SQL 子程序被命名为 PL/SQL 块,可以用一组参数调用它们。PL/SQL 提供两种子程序 --
Functions− 这些子程序返回单个值;主要用于计算和返回一个值。
-
Procedures− 这些子程序不直接返回值;主要用于执行一个动作。
本章将涵盖一个重要方面 PL/SQL procedure. 我们会讨论PL/SQL function 在下一章。 -
PL/SQL 子程序的组成部分
每个 PL/SQL 子程序都有一个名称,也可能有一个参数列表。与匿名 PL/SQL 块一样,命名块也将具有以下三个部分 -序号 零件和说明 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;
在哪里,-
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 块调用过程的名称
上面的程序命名为 'greetings' 可以使用 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 子程序中的参数模式
下表列出了 PL/SQL 子程序中的参数模式 -序号 参数模式及说明 1 ININ 参数允许您将值传递给子程序。 It is a read-only parameter. 在子程序中,IN 参数就像一个常量。它不能被赋值。您可以将常量、文字、初始化变量或表达式作为 IN 参数传递。您也可以将其初始化为默认值;但是,在这种情况下,它会从子程序调用中省略。It is the default mode of parameter passing. Parameters are passed by reference.2 OUTOUT 参数向调用程序返回一个值。在子程序中,一个 OUT 参数就像一个变量。您可以更改其值并在分配后引用该值。The actual parameter must be variable and it is passed by value.3 IN OUT一个 IN OUT参数将初始值传递给子程序并将更新的值返回给调用者。可以为其分配一个值,并且可以读取该值。IN OUT形参对应的实参必须是变量,不能是常量或表达式。形式参数必须被赋值。Actual parameter is passed by value.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.
-
传递参数的方法
实际参数可以通过三种方式传递 -- 位置符号
- 命名符号
- 混合符号
位置符号
在位置符号中,您可以将过程称为 -findMin(a, b, c, d);
在位置记法中,第一个实参代替第一个形参;第二个实参替换第二个形参,以此类推。所以,a 被替换为 x, b 被替换为 y, c 被替换为 z 和 d 被替换为 m.命名符号
在命名符号中,实参与形参使用 arrow symbol ( => ). 过程调用将如下所示 -findMin(x => a, y => b, z => c, m => d);
混合符号
在混合表示法中,您可以在过程调用中混合使用两种表示法;但是,位置符号应该在命名符号之前。以下调用是合法的 -findMin(a, b, c, m => d);
但是,这是不合法的:findMin(x => a, b, c, d);