PLSqL入门与精通(第18章:存储过程具体例子)

这次解说一下存储过程的具体例子。

存储过程是描述一系列处理的命名的PL/SQL块。可以用在各种场合。

本次简介一个具体例子:

例如,在某个公司的业务中,管理着产品的库存。因此,有“库存”的表。

SQL CREATE TABLE库存(
2 产品名称 VARCHAR2(20)PRIMARY KEY,
3 库存数 NUMBER);

表创建成功。

数据登记:电视的库存数为10,收音机的库存数为5。

SQL>INSERT INTO 库存 VALUES('电视’,10);
创建了一行。
SQL>INSERT INTO 库存 VALUES(‘收音机’,5); ‘哈哈,大家不用收音机了,暴露年龄了’
创建了一行。
SQL> COMMIT;

提交完成。

SQL>SELECT FROM 库存;
产品名 库存数
'------------------------------
电视 10
收音机 5

订单表:

订单尽可能简单地做成了以下的:

SQL CREATE TABLE 订单
2(订单ID NUMBER PRIMARY KEY,
3 产品名称 VARCHAR2(20),
4 订购数量 NUMBER);

表创建成功。

这家公司接受订单后,会在订单上登记数据,同时将库存表中该产品的库存减少对应的订货量。

但是,订单数量比库存数量多的情况下,会出现库存不足的错误。

吧这一系列的订单受理处理交给 存储过程:store Project。

程序名称为“PROC订单受理”。
需要交给这个程序的信息,从表的定义是“产品名”和“订购数”。
因为“订单ID”是主关键字,所以我想从顺序对象中获取值。
创建排序对象。名字是以“SEQ订购ID”为名制作的。

SQL CREATE SEQUEENCE SEQ 订单ID;
创建了顺序。
那么,马上制作程序「PROC订单受理」。
尽量简单:

1 CREATE OR REPLACE PROCEDURE PROC接受订单
2(P产品名 IN 订单.产品名%TYPE,P-订单数 IN 订单.订单数%TYPE)
3 IS
4 V库存数 库存.库存数%TYPE;
5 BEGIN
6 SELECT 库存数 INTO V库存数 FROM 库存 WHERE 产品名=P产品名 FOR UPATE;
7 IF P订购数量>V库存数 THEN
8 RAISE APPLICATION ERROR(-2000,“库存不足错误:’|P产品名称);
9 END IF;
10 UPDATE 库存
11 SET 库存数=库存数-P订单数
12 WHERE 产品名称=P产品名称;
13 INSERT INTO订单(订单ID、产品名称、订单数量)
14 VALES(SEQ订单ID.NEXTVAL,P产品名称,P订购数量);
15 COMMIT;
16 EXCEPTION
17 WHEN NO_DATA_FOUND THEN
18 RAISE APPLICATION ERROR(-2001,“错误产品名称”);
19 END;

SQL> /

程序已创建。

在上述例子中,在第6行中将该产品的库存数作为变量取得。

在这个SELECT文上加上FOR UPDATE句是为了防止多个交易同时处理同一产品。

通过在SELECT上加上FOR UPDATE,对针对的对象记录进行枷锁。
从而可以防止多个请求同时处理,保证交易的整合性。

在第7~9行中,将取得的库存数和订单数进行比较,如果订单数量多的话,将发生库存不足的错误。
因此,下面第10行以后是库存不足时的处理。
在第10~12行中,库存表中该产品的库存数量减少了下单数量。

第13~14行,在订单表上登记了订单内容。
产品名和订单数是从这个过程的参数中获取的,并且订单号码是从顺序“SEQ订单ID”中获取的值。

第15行的“COMMIT”并不是在这个过程中更新的确定,而是交易的确定。
因此,如果在调用过程的阶段发生了交易(数据更新等),也包含在内是确定的。

因此,也有不在这个程序中进行COMMIT,而是在调用源进行的想法。

在执行部(第6~15行)中,第6行的SELECT INTO语句为0个时有可能发生系统错误。
也就是说,参数指定的产品名称是错误的产品名称。
为此,在第17~18行中准备了NO DATA FOUND例外处理程序,SELECT INTO文中0件时出现了“是错误的产品名称”的错误。

那么我们试试。

我们点3台电视吧。电视的库存是10台,所以不会库存不足。

SQL> BEGIN
2 PROC 接受订单('电视’,3);
3 END;
4 /

PL/SQL过程成功完成。
根据这个,电视的订购被登记。

SQL>SELECT FROM 订单;

订购ID 产品名 订购数
‘’-----------------------------------------
1 电视 3

另外,电视的库存数是7。

SQL>SELECT FROM 库存;
产品名 库存数
'------------------------------
电视 7
收音机 5

收音机的库存数是5台,如果订购8台收音机,库存不足。

SQL> BEGIN
2 PROC 接受订单('收音机’,8);
3 END;
4 /

BEGIN
行1发生错误。:
ORA-20000:库存不足错误:收音机
ORA-06512: "SCOTT.PROC_受理订货”,行8
ORA-06612:行2
正如上面的结果一样,是库存不足的错误。

那么订购四台就可以了。
1 BEGIN
2 PROC 接受订单(‘收音机’,4);
3 END;

SQL> /
PL/SQL过程成功完成。

根据这个订单,有4台收音机的订单。

SQL>SELECT FROM 订单;

订单ID 产品名 订购数
'----------------------------------------
1 台电视 3
2 收音机 4

而且,收音机的库存数量减少了一台。

SQL>SELECT FROM 库存;

产品名 库存数
'------------------------------

电视 7
广播 1

这次作为具体的例子介绍了像过程一样的处理。

本次到此为止,谢谢。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我是一名AI语言模型,无法提供完整的书籍或课程。但是,我可以为您提供一些学习Oracle PL/SQL的建议: 1. 先学习SQL语言基础,掌握基本的查询、过滤、排序等操作。 2. 学习PL/SQL语言基础,包括变量、条件语句、循环语句、函数、存储过程等。 3. 熟悉Oracle数据库的基本操作,包括表的创建、修改、删除等。 4. 学习Oracle PL/SQL的高级特性,如游标、触发器、异常处理等。 5. 练习实战,通过编写实际的PL/SQL程序来提高自己的技能。 6. 参考相关的书籍、教程、博客等资源,不断学习和提高。 希望这些建议能够对您有所帮助。 ### 回答2: Oracle PL/SQL是一种流行的关系数据库管理系统,它具有强大的编程能力和用户友好的特性。想要从入门精通这个工具,还需要经过以下步骤: 1.了解编程语言:PL/SQL是与SQL紧密相关的编程语言。了解SQL和PL/SQL的基础知识,掌握基本的变量、数据类型、语句和流程控制构造。 2.学习PL/SQL的结构和特性:PL/SQL包含包、过程、函数和触发器,我们需要学习每个结构的定义和用途。 3.掌握代码结构和正确的命名约定:建立一种整洁且易于维护的程序结构和符合行业标准的命名约定。这可以帮助程序员快速查找和修复错误,并且能够与其他程序员之间更好的协作。 4.处理异常:PL/SQL允许开发人员的捕获异常的情况,这是尽可能让代码稳定的一种方法。处理异常的能力是进一步提高PL/SQL代码质量的基础。 5.深入学习行标准库:Oracle PL/SQL有很多用于操作数据库对象的函数和过程,例如包含如存储过程和特定的函数。深入了解这些库,可以极大地提高开发效率,加快开发进程。 6.编写并调试效率高的代码:从代码复杂度到效率和可读性方面考虑,去评估现有代码,并帮助提高代码的故障排查速度。 7.学习动态PL/SQL:动态PL/SQL是替换硬编码变量的一种替代方案,允许改进程序的动态性。当您发现需要编写更灵活的代码,动态PL/SQL就可以解决这个问题。 总之,学习Oracle PL/SQL需要您从其基础知识和函数库入口开始。一方面,熟悉这些基础知识将有助于您了解如何使用PL/SQL来控制数据库。另一方面,深入学习函数库可以从编程的角度洞察PL / SQL语言的工作机制。随着您掌握更多的特性和用例,您就可以逐步提高自己的PL/SQL组成技能,以提高数据库技术水平。 ### 回答3: Oracle PL/SQL是Oracle数据库的编程语言,它结合了SQL语言的数据操纵能力和程序语言的控制结构。这种语言允许用户编写存储过程、触发器、函数和包,这些对象可以在Oracle数据库服务器中存储和执行。Oracle PL/SQL语言的学习可以大大提高数据库开发和管理的效率和安全性。 从入门精通Oracle PL/SQL,需要掌握一些必要的基本知识: 1. SQL语言: PL/SQL必不可少的一部分就是SQL语言。必须了解基本的SELECT 、 UPDATE、DELETE等语句,以及如何进行过滤和排序。 2. 数据类型: 学习PL/SQL必须知道常用的数据类型,例如VARCHAR2、 NUMBER、 DATE等等。这些类型决定着如何进行数据操纵和存储。必须了解数据类型的用法和限制。 3. 基本结构和控制流语句: PL/SQL使用了面向对象的语言结构,例如块(BEGIN/END)和IF/THEN条件语句。还需要掌握循环语句,包括WHILE、FOR、LOOP等。 4. 存储过程存储过程是PL/SQL编程的基础,它是数据库的预定义程序集合。学习存储过程可以提高代码的可重用性、简化维护工作,同时也可以提高性能、增强安全性。 5. 函数和触发器: PL/SQL函数也是预定义程序,它像存储过程一样接收输入参数并返回结果。触发器是在数据表上定义的代码块,可以在特定条件下自动执行。函数和触发器可以极大地简化业务逻辑和提高数据库的完整性和一致性。 6. 调试技巧: PL/SQL开发过程中,调试技巧非常重要。必须掌握如何设置断点、单步调试、观察变量等技巧,以及如何使用Oracle SQL Developer等开发工具进行调试和验证。 总之,PL/SQL学习需积累经验,多实践、多交流,通过参考Oracle技术文档、书籍等所获取的知识,逐步提高编程技巧和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值