实验6PLSQL程序的设计说明

合集下载

ORACLE_PLSQL程序设计

ORACLE_PLSQL程序设计

ORACLE_PLSQL程序设计Oracle PL/SQL是一种强大的编程语言,用于开发Oracle数据库的存储过程、触发器、函数和包。

本篇文章将探讨Oracle PL/SQL程序设计的基本概念、语法和功能,以及一些最佳实践和编程技巧。

PL/SQL是Oracle数据库的内置编程语言,它结合了SQL语句和面向过程的语言特性,可以实现复杂的业务逻辑和数据处理。

PL/SQL程序是在数据库服务器上执行的,它可以访问和操作数据库中的数据,并返回结果。

PL/SQL程序由块组成,一个块是一组PL/SQL语句的逻辑单元。

块由关键字BEGIN和END包围,可以包含变量声明、控制结构、异常处理和SQL语句等。

PL/SQL变量是用来存储和操作数据的命名对象,它可以是标量类型(如整数、字符、日期等)、集合类型(如数组、表)或记录类型。

变量可以在块内部声明,并且可以被块内的其他语句引用。

PL/SQL控制结构用于根据条件执行特定的代码块。

常见的控制结构有IF-THEN、IF-THEN-ELSE、CASE等。

这些控制结构可以根据条件执行不同的代码块,增强了程序的灵活性和可读性。

异常处理是PL/SQL程序设计的重要部分。

当出现意外情况或错误时,异常处理机制可以捕获异常并采取相应的措施。

PL/SQL提供了TRY-CATCH结构来处理异常,可以在CATCH块中编写相应的异常处理代码。

PL/SQL还支持存储过程、触发器和函数等数据库对象的定义和使用。

存储过程是一种一次性地执行一系列操作的程序,触发器是在数据库中发生特定事件时自动执行的程序,函数是返回一个值的程序。

这些数据库对象可以帮助我们实现复杂的业务逻辑和数据操作。

在PL/SQL程序设计中,有一些最佳实践和编程技巧值得注意。

首先,要注意代码的可读性和可维护性,良好的命名约定、适当的缩进和注释可以提高代码的可读性。

其次,需要注意异常处理,正确处理和记录异常可以提高程序的稳定性和可靠性。

PLSQL程序设计

PLSQL程序设计
通过PL/SQL编写的存储过程和触发器可以 用于实现数据访问控制,确保数据的安全性量数据类型
包括数值型(如NUMBER)、字符型(如VARCHAR2)、 日期型(如DATE)等。
01
集合数据类型
包括表、数组和集合,用于存储多个值。
02
03
自定义数据类型
使用COMMIT语句可以提交事务,将所有未提交的更改永久保存到数据库中。
感谢您的观看
THANKS
循环读取
使用循环结构(如WHILE循环)逐行读取游标中的数据。
异常处理
在读取游标数据时,应处理可能出现的异常,以确保程序的健壮 性。
游标的关闭
关闭游标
使用CLOSE语句关闭游标,释放与 游标相关的资源。
清理资源
关闭游标后,应释放所有与游标相关 的变量和资源,以避免内存泄漏。
06
PL/SQL事务处理
BEFORE触发器
在指定的事件(如INSERT、UPDATE或DELETE)之前执行的操作。
AFTER触发器
在指定的事件之后执行的操作。
INSTEAD OF触发器
用于视图,当对视图进行修改操作时,触发器中的操作替代了原本 的修改操作。
触发器的应用场景
数据完整性维护
触发器可用于确保数据的完整性,例如, 在更新员工工资时自动计算并更新员工
的总收入。
条件约束
触发器可用于实现复杂的业务规则, 例如,限制某些用户不能删除其他用
户的记录。
自动日志记录
触发器可以在数据修改时自动记录操 作日志,便于跟踪数据变更历史。
数据转换
触发器可以在数据修改时自动进行数 据转换或格式化,例如,将日期字段 自动转换为特定的格式。
05

plsql编程

plsql编程

5.游标的使用
提取游标数据: 提取游标数据:就是检索结果集合中的数据行, 放入指定的输出变量中。 格式: FETCH cursor_name INTO {variable_list | record_variable };
5.游标的使用
关闭游标: 关闭游标:当提取和处理完游标结果集合数据后, 应及时关闭游标,以释放该游标所占用的系统资 源,并使该游标的工作区变成无效,不能再使用 FETCH 语句取其中数据。关闭后的游标可以使用 OPEN 语句重新打开。 格式: CLOSE cursor_name;
6.创建和调用存储过程
创建过程语法格式: 创建过程语法格式
CREATE [OR REPLACE] PROCEDURE Procedure_name [ (argment [ { IN | IN OUT }] Type, argment [ { IN | OUT | IN OUT } ] Type ] { IS | AS } <类型.变量的说明> BEGIN <执行部分> EXCEPTION <可选的异常错误处理程序> END;
5.游标的使用
游标属性
%FOUND:布尔型属性,当最近一次读记录时成 功返回,则值为TRUE; %NOTFOUND:布尔型属性,与%FOUND相反; %ISOPEN:布尔型属性,当游标已打开时返回 TRUE; %ROWCOUNT:数字型属性,返回已从游标中读 取的记录数 。
6.创建和调用存储过程
创建带输入参数和输出参数的存储过程
调用p4: declare a varchar2(10):='001'; b number; c number; begin p4(a,b,c); dbms_output.put_line(b||'--'||c); end;

PLSQL编程语言的使用与程序设计

PLSQL编程语言的使用与程序设计

实验五PL/SQL编程语言的使用与程序设计【开发语言及实现平台或实验环境】Oracle10g【实验目的】(1)了解PL/SQL在Oracle中的基本概念;(2)掌握PL/SQL的各组成部分;(3)PL/SQL的运用。

【实验原理】1.PL/SQL字符集和所有其他程序设计语言一样,PL/SQL也有一字符集。

读者能从键盘上输入的字符集是PL/SQL的字符。

此外,在某些场合,还有使用某些字符的规定。

我们将要详细介绍:●用PL/SQL编程时可能使用的字符●算术运算符●关系运算符●杂符号1)合法字符用PL/SQL程序时,允许使用下列字符:●所有大、小写字母●数字0到9●符号:()+-*/〈〉=!~;:.‘@ %,“# $ ^ & _ | { } ?[ ]2)算术运算符下面列出了PL/SQL中常用的算术运算符。

如果读者使用过其他高级程序设计语言,想必不会陌生:表6 算术运算符运算符意义+ 加法- 减法* 乘法/ 除法** 幂关系运算符下面列出了PL/SQL中常用的关系运算符。

如果读者有使用其他程序设计语言的经验,一定见过这些符号:表7 关系运算符运算符意义<> 不等于!= 不等于^= 不等于< 小于> 大于= 等于3)杂符号PL/SQL为支持编程,还使用下述符号。

下面列出了部分符号,它们是最常用的,也是使用PL/SQL的所有读者都必须了解的。

表8 杂符号4)变量变量是PL/SQL中用来处理数据项所用的名字。

读者根据下列规则选择变量名称:●变量必须以字母(A~Z)开头。

●其后跟可选的一个或多个字母,数字(0~9)或特殊字符$、# 或_。

●变量长度不超过30个字符。

●变量名中不能有空格。

5)保留字保留字可视为PL/SQL版权所有的字符串。

在定义变量名时,读者不能使用这些保留字。

例如,词“loop”在PL/SQL中有特殊含义,因此下列代码是非法的:declareemployee varchar2(30);loop number;保留字不能用作变量名。

PL/SQL程序设计

PL/SQL程序设计

PL/SQL程序设计PL/SQL是一种数据库编程语言,广泛应用于Oracle数据库管理系统中。

它是SQL的一种扩展,添加了过程性编程的特性,允许开发者创建更复杂、可重用的程序逻辑。

PL/SQL程序设计可以分为以下几个方面:1.PL/SQL的基本概念:PL/SQL是过程性语言和SQL结构的结合。

它使用块的概念,一个块由一个可选的声明部分、一个执行部分和一个可选的异常处理部分组成。

PL/SQL程序可以包含变量、常量、游标和异常处理等元素。

2.变量和数据类型:在PL/SQL中,可以通过声明变量来存储和操作数据。

PL/SQL中支持多种数据类型,包括基本的整型、字符型、日期型等,还可以自定义记录类型和表类型。

使用变量可以在程序中存储临时数据,进行运算和逻辑判断。

3.控制结构:PL/SQL支持多种控制结构,包括条件语句、循环语句和异常处理语句。

条件语句可以根据一些条件来执行不同的操作。

循环语句可以重复执行一段代码,直到满足退出条件为止。

异常处理语句用于捕获和处理运行时错误,保证程序的健壮性。

4.子程序:PL/SQL中的子程序可以是存储过程、函数或触发器。

存储过程是一段可重用的代码块,它可以在数据库中存储和调用。

函数是一个具有返回值的子程序,可以在SQL语句中使用。

触发器是与表相关联的特殊存储过程,当满足特定的条件时自动触发。

5.游标和异常处理:PL/SQL中的游标用于处理查询结果集。

游标可以使用循环语句来遍历结果集,并进行相应的操作。

异常处理是PL/SQL的一大特点,它可以有效地捕获和处理运行时错误。

在异常处理部分,可以指定对应不同类型错误的处理方式,例如日志记录、回滚事务等。

6.包和包体:PL/SQL中的包是一种逻辑上的封装,它可以包含变量、常量、游标和子程序等。

包体是包的实现部分,声明和定义了包中的各个元素。

使用包可以将相关的数据和逻辑组织在一起,提供更好的可维护性和可重用性。

7.异常处理和日志记录:在实际的PL/SQL开发中,异常处理是非常重要的。

实践 PLSQL程序设计

实践 PLSQL程序设计

《数据库开发技术》课程之实践视图、序列、同义词和索引一、实验目的1.熟练掌握创建、使用、修改、删除和查看视图、序列、同义词和索引的方法。

二、实验内容和要求1. 创建一个部门月薪统计视图,包括所有的部门号,所有的部门名,各部门人数,各部门平均薪水、最高薪水和最低薪水。

DEPTNO DNAME COUNT_NUM AVG_SAL MAX_SAL MIN_SAL---------- -------------- ---------- ---------- ---------- ----------10 ACCOUNTING 5 2710 5000 130020 RESEARCH 5 2175 3000 80030 SALES 6 1566.66667 2850 95040 OPERATIONS 0已选择4行。

create view dept_viewas select dept.deptno DEPTNO,dept.dname DNAME,count(emp.deptno) "COUNT NUM",avg(sal)"A VG SAL" ,max(sal)"MAX SAL ",MIN(sal)"MIN SAL" from emp ,deptwhere emp.deptno(+)=dept.deptnogroup by dept.deptno,dept.dnameorder by dept.deptno;2. 创建一个新的序列empno_seq,序列的步长为1,起始值为7961,最大值为9999,并且不允许序列循环。

用此序列可以向EMP表中插入新雇员。

create sequence empno_seqincrement by 1start with 7961maxvalue 9999nocycleorder;select sequence_name, min_value, max_value, increment_by, last_numberFROM user_sequences;3. 使用empno_seq序列向EMP表添加一新雇员。

PL╱SQL程序设计

PL╱SQL程序设计

PL/SQL程序设计目录第一章PL/SQL 程序设计简介 (4)§1.2SQL与PL/SQL (4)§1.2.1 什么是PL/SQL? (4)§1.2.1 PL/SQL的好处 (4)§1.2.2 PL/SQL 可用的SQL语句 (5)§1.3运行PL/SQL程序 (5)第二章PL/SQL块结构和组成元素 (6)§2.1PL/SQL块 (6)§2.2PL/SQL结构 (6)§2.3标识符 (6)§2.4PL/SQL变量类型 (7)§2.4.1 变量类型 (7)§2.4.2 复合类型 (9)§2.4.3 使用%ROWTYPE (11)§2.4.4 LOB类型* (11)§2.4.5 Bind 变量 (11)§2.4.6 INDEX BY TABLES (12)§2.4.7 数据类型的转换* (13)§2.5运算符和表达式(数据定义) (13)§2.5.1 关系运算符 (13)§2.5.2 一般运算符 (13)§2.5.3 逻辑运算符 (14)§2.6变量赋值 (14)§2.6.1 字符及数字运算特点 (14)§2.6.2 BOOLEAN 赋值 (14)§2.6.3 数据库赋值 (14)§2.6.4 可转换的类型赋值 (15)§2.7变量作用范围及可见性 (15)§2.8注释 (16)§2.9简单例子 (17)§2.9.1 简单数据插入例子 (17)§2.9.2 简单数据删除例子 (17)第三章PL/SQL流程控制语句 (18)§3.1条件语句 (18)§3.2CASE表达式 (19)§3.3循环 (19)§3.3标号和GOTO (21)§3.4NULL语句 (21)第四章游标的使用 (23)§4.1游标概念 (23).1 处理显式游标 (23)§4.1.2 处理隐式游标 (26)§4.1.3 游标修改和删除操作 (27)第五章异常错误处理 (29)§5.1异常处理概念 (29)§5.1.1 预定义的异常处理 (29)§5.1.2 非预定义的异常处理 (30)§5.1.3 用户自定义的异常处理 (31)§5.1.4 用户定义的异常处理 (32)§5.2异常错误传播 (33)§5.2.1 在执行部分引发异常错误 (33)§5.2.2 在声明部分引发异常错误 (34)§5.3异常错误处理编程 (34)§5.4在PL/SQL中使用SQLCODE,SQLERRM (35)第六章存储函数和过程 (36)§6.1引言 (36)§6.2创建函数 (36)§6.3存储过程 (39)§6.3.1 创建过程 (39)§6.3.2 调用存储过程 (40)§6.3.3 开发存储过程步骤 (42)§6.3.4 与过程相关数据字典 (43)第七章包的创建和应用 (44)§7.1引言 (44)§7.2包的定义 (44)§7.3包的开发步骤 (45)§7.4包定义的说明 (45)§7.5子程序重载 (48)§7.6删除过程、函数和包 (50)§7.7包的管理 (50)第八章触发器 (51)§8.1触发器类型 (51)§8.1.1 DML触发器 (51)§8.1.2 替代触发器 (51)§8.1.3 系统触发器 (51)§8.2创建触发器 (51)§8.2.1 触发器触发次序 (53)§8.2.2 创建DML触发器 (53)§8.2.3 创建替代(Instead_of)触发器 (54)§8.2.3 创建系统事件触发器 (54)§8.2.4 系统触发器事件属性 (55)§8.2.5 使用触发器谓词 (56)§8.2.6 重新编译触发器 (56)§8.3删除和使能触发器 (56)§8.4触发器和数据字典 (57)§8.5数据库触发器的应用举例 (57)第一章PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。

数据库实验六_使用PLSQL编写存储过程访问数据库

数据库实验六_使用PLSQL编写存储过程访问数据库

数据库原理实验报告
实验名称
使用PL/SQL编写存储过程访问数据库
实验环境
硬件平台:Intel Core i5-3210M
操作系统:Windows 8.1
数据库管理系统(DBMS):MySQL Server 5.5
实验内容及步骤
1.由于我们实验所用的MySQL不支持PL/SQL,但提供了存储过程的功能。

因此我们通过
在MySQL中建立存储过程来完成本实验。

2.建立一个存储过程,用来向student表添加一条学生记录,如图:
在存储过程中,我们将学号,姓名,性别,年龄以及系别作为存储过程的输入参数。

3.在调用存储过程前,我们先查看一下student表:
4.下面,我们调用存储过程,向表中插入一条数据,如下:
5.调用完成后,我们再次查看student表中的内容:
可以看到,刚才调用存储过程向student表中插入的数据已在表中,说明插入成功。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验6 PL/SQL程序设计1 实验目的(1)掌握PL/SQL程序开发方法。

(2)掌握存储过程、函数、触发器、包的创建于调用。

2 实验要求(1)根据图书销售系统业务要求创建特定的存储过程、函数、触发器。

(2)根据图书销售系统业务要求将图书销售系统相关的函数、存储过程封装到包里。

3 实验步骤以bs用户登录BOOKSALES数据库,利用PL/SQL程序编写下列功能模块。

(1)创建一个存储过程,输出不同类型图书的数量、平均价格。

SQL> create or replace procedure proc_category_static2 as3 --定义游标,获取当前有哪些图书种类4 cursor c_all_category is select distinct category from books;5 --图书的平均价格6 v_avg_cost number;7 begin8 --保存图书种类9 for v_each_category in c_all_category LOOP10 select avg(retail) into v_avg_cost from books where category=v_each_category.category group by category;11 dbms_output.put_line('种类为:'||v_each_category.category||',平均价格为:'|| v_avg_cost);12 END LOOP;13 end proc_category_static;14 /(2)创建一个存储过程,以客户号为参数,输出该客户订购的所有图书的名称与数量。

create or replace procedure proc_get_orderinfo(2 p_customer_id customers.customer_id%type)3 as4 --声明游标存储客户的订单号5 cursor c_orderid is select order_id from orders where customer_id=p_customer_id;6 v_orderid orders.order_id%type;7 --声明游标存储订单信息8 cursor c_orderitem is select ISBN, sum(quantity) totalnum from orderitem where order_id=v_orderid group by ISBN;9 --保存图书的书名10 v_title books.title%type;1112 begin13 open c_orderid;14 LOOP15 fetch c_orderid into v_orderid;16 exit when c_orderid%NOTFOUND;17 for v_orderitem in c_orderitem LOOP18 select title into v_title from books where ISBN=v_orderitem.ISBN;19 DBMS_OUTPUT.PUT_LINE(p_customer_id||'订购'||v_title||'的数量是'||v_orderitem.totalnum);20 end LOOP;21 end LOOP;22 close c_orderid;23 end proc_get_orderinfo;24 /exec proc_get_orderinfoo(1001);(3)创建一个存储过程,以订单号为参数,输出该订单中所有图书的名称、单价、数量。

create or replace procedure proc_get_orderinfoo(p_order_id orderitem.order_id%type)as--声明游标存储订单号的ISBNcursor c_ISBN is select ISBN from orderitem where order_id=p_order_id;v_ISBN orderitem.ISBN%type;--声明游标存储订单信息cursor c_orderitem is select ISBN,sum(quantity) totalnum from orderitem where ISBN=v_ISBN ;v_title books.title%type;v_retail books.retail%type;beginopen c_ISBN;LOOPfetch c_ISBN into v_ISBN;exit when c_ISBN%NOTFOUND;for v_orderitem in c_orderitem LOOPselect title,retail into v_title,v_retail from books where ISBN=v_orderitem.ISBN;DBMS_OUTPUT.PUT_LINE(p_order_id||v_title||v_retail||v_orderitem.totalnum);end LOOP;end LOOP;close c_ISBN;end proc_get_orderinfoo;/(4)创建一个存储过程,以名为参数,输出该出版的所有图书的名称、ISBN、批发价格、零售价格信息。

create or replace procedure proc_get_name(p_title books.title%type)ascursor c_orderid is select order_id from orders where customer_id=p_customer_id;v_orderid orders.order_id%type;cursor c_orderitem is select ISBN, sum(quantity) totalnum from orderitem where order_id=v_orderid group by ISBN;v_title books.title%type;beginopen c_orderid;LOOPfetch c_orderid into v_orderid;exit when c_orderid%NOTFOUND;for v_orderitem in c_orderitem LOOPselect title into v_title from books where ISBN=v_orderitem.ISBN;DBMS_OUTPUT.PUT_LINE(p_customer_id||''||v_title||'的数量是'||v_orderitem.totalnum);end LOOP;end LOOP;close c_orderid;end proc_get_orderinfo;/set serveroutput ondeclarev_customer number;beginv_customer :=&x;proc_get_orderinfo(v_customer);end;/(5)创建一个存储过程,输出每个客户订购的图书的数量、价格总额。

create or replace procedure proc_category_staticascursor c_all_category is select distinct category from books;v_sum_cost number;beginfor v_each_category in c_all_category LOOPselect sum(retail) into v_sum_cost from books wherecategory=v_each_category.category group by category;dbms_output.put_line('种类为:'||v_each_category.category||',总价格为:'|| v_sum_cost);END LOOP;end proc_category_static;/set serveroutput onexec proc_category_static;/(6)创建一个存储过程,输出销售数量前3名的图书的信息及销售名次。

create or replace procedure proc_category_staticascursor c_all_category is select distinct category from books;v_sum_retail number;beginfor v_each_category in c_all_category LOOPselect sum(cost) into v_sum_retail from books wherecategory=v_each_category.category group by category;dbms_output.put_line('种类为:'||v_each_category.category||',数量为:'||v_sum_retail);END LOOP;end proc_category_static;/set serveroutput onexec proc_category_static;(7)创建一个存储过程,输出订购图书数量最多的客户的信息及订购图书的数量。

(8)创建一个存储过程,输出各类图书中销售数量最多的图书的信息及销售的数量。

(9)创建一个包,实现查询客户订购图书详细信息的分页显示。

create or replace procedure proc_title_staticascursor c_all_title is select distinct title from books;v_sum_retail number;beginfor v_each_title in c_all_title LOOPselect sum(cost) into v_sum_retail from books where title=v_each_title.title group by title;dbms_output.put_line('信息为:'||v_each_title.title||',数量为:'|| v_sum_retail);END LOOP;end proc_title_static;/(10)创建一个包,利用集合实现图书销售排行榜的分页显示。

相关文档
最新文档