首页 > 数据库 >无涯教程-PL/SQL - 存储过程(Procedures)

无涯教程-PL/SQL - 存储过程(Procedures)

时间:2023-12-22 17:31:59浏览次数:37  
标签:无涯 参数 PROCEDURE SQL Procedures 子程序 PL OUT

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

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

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

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

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

存储过程

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

S.No Parts & 描述
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.No Parameter Mode & 描述
1

IN

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

2

OUT

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

3

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.

参数传递方法

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

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

参考链接

https://www.learnfk.com/plsql/plsql-procedures.html

标签:无涯,参数,PROCEDURE,SQL,Procedures,子程序,PL,OUT
From: https://blog.51cto.com/u_14033984/8937252

相关文章

  • mysql-binlog恢复命令
    查看是否开启binloq:showvariableslike'logbing';开启binlog:log-bin="LAPTOP-7FRIEVH7-bin关闭binlog:skip-log-bin生成新的binlog文件:方式一:重启mysq1服务使用命令flushlogs方式二:查看binlogshowbinlogeventsin'ECS-56099351-bin.00001';将binlog日志并......
  • 将excel数据导入到SQL server数据库的详细过程
    原文链接:https://www.xjx100.cn/news/415146.html?action=onClick1.将要导入的excel表格数据如下,第一行数据默认为数据库表中的字段,所以这个必须要有,否则无法映射导入。如下图(只截部分数据) 2.打开MicrosoftSQLServerManagementStudio17数据库管理软件,选中要导入的mydb数......
  • Scrapy爬网站数据,存到MySQL
    一、框架简介1.1、简介  Scrapy框架是用纯Python实现的一个为了爬取网站数据、提取结构性数据而编写的可扩展的开源应用框架,只需要少量代码就能够快速地实现数据爬取。往往手写一个爬虫需要进行发送网络请求、数据解析、数据存储、反反扒机制、异步请求等步骤,如果都从零开始......
  • cpp-opt-mysql
    title:c++操作mysql数据库author:TokisakiGalaxytop:falsecover:falsetoc:truecomments:truemathjax:falsenoindex:falsesitemap:truedate:2020-09-1214:17:04img:coverImg:excerpt:C++操作mysql数据库tags:-C++-mysqlcategories:-编程pas......
  • 关于debezium同步mysql字段类型的datetime、date、time、timestamp的格式转换说明
    1.情景展示使用debezium的插件:debezium-connector-oracle(io.debezium.connector.mysql.MySqlConnector),自动读取mysql日志binlog相关表的数据变更记录,然后将其发布到kafkatopic当中。现在遇到的问题是:在mysql当中,表示日期类型的数据类型有:datetime、date和timestamp;表示时间......
  • mysql给指定账号取消drop权限
    要修改MySQL用户的权限,可以使用以下步骤:1、登录MySQL服务器:mysql-uroot-p2、选择数据库:如果要修改用户在特定数据库中的权限,可以选择对应的数据库。例如:USEyour_database;3、查看当前用户权限:SHOWGRANTSFOR'username'@'hostname';将'username'替换为要修......
  • MySQL数据库-2
    MySQL数据库-2第09章子查询#第09章子查询SELECTlast_name,salaryFROMemployeesWHEREsalary>( SELECTsalary FROMemployees WHERElast_name='Abel' );#2.单行子查询SELECTemployee_id,manager_id,department_idFROMemployeesWHERE(manager_id,depart......
  • zabbix5.0监控postgresql13.6
    环境描述zabbix版本:5.0.12PG版本:13.6监控需求监控postgresql运行情况(非核心业务,主要监控挂没挂)监控流复制运行情况如有异常,则告警具体步骤在postgresql上创建监控用户,授权,并配置pg_hba.conf文件允许通过该用户去访问到zabbix的网站上下载监控脚本将脚本部署在po......
  • mysql安装
    #tarxvfMySQL-5.6.28-1.linux_glibc2.5.x86_64.rpm-bundle.tarMySQL-embedded-5.6.28-1.linux_glibc2.5.x86_64.rpmMySQL-test-5.6.28-1.linux_glibc2.5.x86_64.rpmMySQL-shared-5.6.28-1.linux_glibc2.5.x86_64.rpmMySQL-server-5.6.28-1.linux_glibc2.5.x86_64.rpmMy......
  • 达梦数据库常用SQl语句
    1.创建表空间语句1createtablespace"表空间名"datafile'数据文件路径/表空间名.DBF'size256(初始大小)autoextendonmaxsize67108863P(设置自动增长)CACHE=NORMAL;2.创建用户1CREATEUSER"用户名"IDENTIFIEDBY"密码"HASHWITHSHA512NOSALTPASS......