PL / SQL - 程序

在本章中,我们将讨论PL/SQL中的过程. 子程序是执行特定任务的程序单元/模块.这些子程序组合在一起形成更大的程序.这基本上被称为"模块化设计".子程序可以由另一个子程序或程序调用,称为调用程序.

子程序可以创建 : 去;

  • 在架构级别

  • 在包内

  • 在PL/SQL块内

在架构级别,子程序是独立子程序.它是使用CREATE PROCEDURE或CREATE FUNCTION语句创建的.它存储在数据库中,可以使用DROP PROCEDURE或DROP FUNCTION语句删除.

在包内创建的子程序是打包的子程序.它存储在数据库中,只有在使用DROP PACKAGE语句删除包时才能删除它.我们将在'PL/SQL  - 包'一章讨论包.

PL/SQL子程序被命名为PL/SQL块,可以使用set调用参数. PL/SQL提供两种子程序 :

  • 功能 : 这些子程序返回单个值;主要用于计算和返回一个值.

  • 程序 : 这些子程序不直接返回值;主要用于执行操作.

本章将介绍 PL/SQL过程的重要方面.我们将在下一章讨论 PL/SQL函数.

PL/SQL子程序的各个部分

每个PL/SQL子程序有一个名称,也可能有一个参数列表.与匿名PL/SQL块一样,命名块也将具有以下三个部分 :

S.NoParts&描述
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]选项允许修改现有过程.

  • 可选参数列表包含参数的名称,模式和类型. 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子程序中的参数模式和减号;

S.No参数模式&描述
1

IN

使用IN参数可以将值传递给子程序. 这是一个只读参数.在子程序内部,IN参数的作用类似于常量.它无法分配值.您可以将常量,文字,初始化变量或表达式作为IN参数传递.您也可以将其初始化为默认值;但是,在这种情况下,子程序调用中省略了它. 这是参数传递的默认模式.参数通过引用传递.

2

OUT

OUT参数返回一个值到调用程序.在子程序内部,OUT参数就像一个变量.您可以在分配值后更改其值并引用该值. 实际参数必须是可变的,并且按值传递.

3

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.

传递参数的方法

实际参数可以三种方式传递 :

  • 位置符号

  • 命名符号

  • 混合符号

位置表示法

在位置表示法中,您可以将程序调用为 :

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);