PL/SQL - 存储过程(Procedures)

PL/SQL - 存储过程(Procedures) 首页 / PL/SQL入门教程 / PL/SQL - 存储过程(Procedures)

在模式级别,存储过程是独立子程序,它是使用CREATE PROCEDURECREATE FUNCTION语句创建的,它存储在数据库中,可以使用DROP PROCEDUREDROP FUNCTION语句删除。

PL/SQL子程序被称为PL/SQL块,可以使用一组参数来调用它们。 PL/SQL提供两种子程序-

  • Functions   - 这些函数返回单个值,主要用于计算和返回值。

  • Procedures - 这些存储过程不直接返回值,主要用于执行动作。

本章将介绍 PL/SQL过程的重要方面。无涯教程将在下一章讨论 PL/SQL函数。

存储过程

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

S.NoParts & 描述
1

Declarative Part

这是一个可选部分。但是,子程序的声明部分不是以DECLARE关键字开头,它包含类型,游标,常量,变量,异常和嵌套子程序的声明,这些项目在子程序中是本地的,并且在子程序完成执行时不再存在。

2

Executable Part

这是必不可少的部分,包含执行指定动作的语句。

3

Exception-handling

这也是可选部分,它包含处理运行时错误的代码。

创建存储程序

使用 CREATE或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; 

下面的示例创建一个简单的过程,该过程show character串" 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.NoParameter Mode & 描述
1

IN

IN参数使您可以将值传递给子程序,这是一个只读参数,在子程序内部,IN参数的作用类似于常量。

2

OUT

OUT参数将值返回到调用程序,在子程序中,OUT参数的作用类似于变量,您可以更改其值,并在分配后引用该值。 

3

IN OUT

IN OUT参数将初始值传递给子程序,然后将更新后的值返回给调用方。可以为其分配一个值,并且可以读取该值。

IN & OUT示例1

该程序找到两个值中的最小值。在此,该过程使用IN模式获取两个数字,并使用OUT参数返回其最小值。

链接:https://www.learnfk.comhttps://www.learnfk.com/plsql/plsql-procedures.html

来源:LearnFk无涯教程网

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.

参数传递方法

实际参数可以通过三种方式传递-

  • Positional 符号
  • Named 符号
  • Mixed 符号

Positional符号

在位置表示法中,您可以将过程称为-

findMin(a, b, c, d);

在位置表示法中,第一个实际参数代替第一个形式参数;第二个实际参数代替第二个形式参数,依此类推。因此,用 a 替代 x,用b 替代 y,用c 替代 z 和 d 代替 m 

Named符号

在命名符号中,实际参数与使用箭头符号(=>)的形式参数相关联,过程调用将类似于以下内容-

findMin(x => a, y => b, z => c, m => d);

Mixed符号

在混合表示法中,您可以在过程调用中混合使用两种表示法,但是,位置符号应在命名符号之前。

以下是合法的-

findMin(a, b, c, m => d);

但是,这是不合法的:

findMin(x => a, b, c, d); 

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

JavaScript核心原理解析 -〔周爱民〕

Electron开发实战 -〔邓耀龙〕

Serverless入门课 -〔蒲松洋(秦粤)〕

说透芯片 -〔邵巍〕

React Native 新架构实战课 -〔蒋宏伟〕

人人都用得上的数字化思维课 -〔付晓岩〕

Kubernetes入门实战课 -〔罗剑锋〕

云原生架构与GitOps实战 -〔王炜〕

结构学习力 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)