第三章 PL/SQL编程
3.1 PL/SQL基础知识
3.1.1 什么是PL/SQL?
PL/SQL是结合Oracle过程语言和结构化查询语言的一种扩展语言
3.1.1.1 PL/SQL体系结构(教材76页图3.2)
3.1.1.2 PL/SQL块简介
定义:PL/SQL是一种块结构语言,它将一组语句放在一个块中。
组成:声明部分、执行部分、异常处理部分。
结构:[DECLARE]
--声明部分
BEGIN
--执行部分
[EXCEPRION]
异常处理部分
END;
--执行部分不能省略
3.1.1.3 运算部分和表达式
关系运算符:=、(<>、!=、~=、^=)不等于、<、>、<=、>=、
一般运算符:+、-、*、/、(:=)赋值号、=>、(..)范围运算符、||
逻辑运算符:IS NULL、BETWEEN AND、IN、AND、OR、NOT
3.1.1.4 常量和变量的声明
3.1.1.3.1 变量:
DECLARE variable_name date_type[(size)][:=init_value];
variable_name:变量名
date_type:数据类型
size:指定变量范围
init_value:变量的初始值
3.1.1.3.2 常量:
DECLARE variable_name CONSTANT date_type :=value;
标识符定义要求:
1、标识符名不能超过30个字符
2、第一个字符必须为字母
3、不区分大小写
4、不能用’-‘号
5、不能是SQL保留字
编码规则:1、利用缩进排列展现逻辑结构
2、利用大小写增强可读性
3、格式化单独语句
4、格式化SQL语句
3.1.1.5 注释
单行注释:--这是注释
多行注释:/*这是注释*/
3.1.2 PL/SQL数据类型
3.1.2.1 标量数据类型
类型 子类
CHAR character
nchar
VARCHAR2 Varchar String
NVARCHAR2
BINARY_INTEGER --带符号整数,为整数计算优化性能
NUMBER(p,s) Dec
Double Precision--整数
Integer --整数
Int
Numeric
Real
Small int
LONG --变长字符
DATE
BOOLEAN --布尔
3.1.2.2 LOB数据类型
BFILE
BLOB
CLOB
NCLOB
3.1.2.3 属性类型
%TYPE:定义一个变量
优点:可以不必知道所引用的数据库列的数据类型
所引用的数据库列可以实时改变,容易保持一致,不要修改PL/SQL程序
%ROWTYPE:返回一个记录类型
优点:可以不必知道所引用的数据库列的个数和数据类型
所引用的数据库列的个数和数据类型可以实时改变,容易保持一致,不要修改PL/SQL程序
3.1.3 PL/SQL控制语句
3.1.3.1 条件控制
IF语句和CASE语句
IF语法:
IF<布尔表达式> THEN
PL/SQL和SQL语句
END IF;
IF-ELSE语法:
IF<布尔表达式> THEN
PL/SQL和SQL语句
ELSE
--其他语句
END IF;
--多重IF语法
IF<布尔表达式> THEN
PL/SQL和SQL语句
ELSIF<其他布尔表达式> THEN
其他语句
ELSIF<其他布尔表达式> THEN
其他语句
ELSE
其他语句
END IF;
注:ELSIF——————ELSEIF 不要写错
CASE语法:
一:
CASE 条件表达式
WHEN 条件表达式结果1 THEN
语句段1
WHEN 条件表达式结果2 THEN
语句段2
WHEN 条件表达式结果n THEN
语句段n
[ELSE 语句段]
END CASE;
二:
CASE
WHEN 条件表达式1 THEN
语句段1
WHEN 条件表达式2 THEN
语句段2
WHEN 条件表达式n THEN
语句段n
[ELSE 语句段]
END CASE;
3.1.3.2 循环控制
LOOP循环:
LOOP
要执行的语句;
EXIT WHEN<条件语句>--满足条件,退出循环
END LOOP;
WHILE循环:
WHILE<布尔表达式>
LOOP
要执行的语句;
END LOOP;
FOR循环:
FOR 循环计数器 IN [REVERSE] 下限 ... 上限
LOOP
要执行的语句;
END LOOP;
3.1.3.3 顺序控制
NULL语句:这是一个可执行语句,相当于一个占位符或不执行任何操作的空语句,
可以使某些语句变得有意义,提高程序可读性,保证其他语句结果的完整性和正确性。
3.2 异常处理
3.2.1 什么是异常:在程序运行时出现的错误叫作异常。
3.2.2 预定义异常:(教材84页)
异常处理程序的语法:
BEGIN
sequence_of_statements;
EXCEPRION
WHEN <exception_name> THEN
sequence_of_statements;
WHEN OTHERS THEN
sequence_of_statements;
END;
OTHERS:处理程序确保不会漏掉任何异常
3.2.3 处理用户自定义异常
步骤:1、在PL/SQL块的定义部分定义异常情况
<异常情况> EXCEPRION
2、抛出异常情况
PAISE <异常情况>;
3、在PL/SQL块的异常情况处理部分对异常情况作出相应处理
RAISE_APPLICATION_ERRO--储存过程,可以重新定义异常错误信息
语法:RAISE_APPLICATION_ERRO(error_name,error message);
3.3 显示游标
3.3.1 基本原理
在Oracle中,在执行一个查询,新增,修改,删除语句PL/SQL块时,Oracle在内存中分配一个缓冲区
将执行结果放在缓冲区,游标则是指向该区的一个指针。
3.3.2 游标分类
静态游标:隐式游标、显式游标
动态游标:。。。
3.3.3 显式游标
3.3.3.1 显示游标使用步骤
1)声明游标
语法:
CURSOR cursor_name [(parameter,[,parameter]...)]
[RETURN return_type] IS select_statements;
cursor_name:游标名称
parameter:为游标指定输入参数
return_type:定义游标提取的行的类型
select_statemenst:游标定义的查询语句
2)打开游标
语法:
OPEN cursor_name[(parameter)];
3)提取游标
语法:
FETCH cursor_name INTO variables;--变量名
4)关闭游标
语法:
CLOSE cursor_name;
3.3.3.2 显示游标属性
1、%FOUND:只有DML影响一行或多行时,此属性才返回TRUE;
2、%NOTFOUND:与%FOUND属性相反,没有影响时,返回TRUE;
3、%ROWCOUNT:返回受影响行数
4、ISOPEN:返回游标是否已开启
3.3.3.3 使用显示游标删除或更新
更新:
CURSOR cursor_name IS
select_statements FOR UPDATE [OF columns];--更新查询,锁定选择的行,
1)选择单表更新查询时,可以省略OF子句
2)当选择多个表更新查询时,被锁定的行来源于OF子句后声明的列所在的表中的行。
在使用FOR UPDATE声明游标之后,
UPDATE table_name
SET column_name =column_value
WHERE CURRENT OF cursor_name;
多表查询时,更新表为锁定行所在的表
3.3.3.3 使用循环游标简化游标的读取
语法:
FOR record_index IN cursor_name
LOOP
executable_statements
END LOOP;
record_index:声明的记录变量值
3.4 储存过程
3.4.1 子程序的组成
子程序是已经定义的PL/SQL块
3.4.1.1声明部分
3.4.1.2可执行部分
3.4.1.3异常处理部分(可选)
3.4.2 储存过程的基本用法
1)创建储存过程
CREATE [OR REPLACE] PROCEDURE procadure_name--储存过程名称
[(procadure_list)]--参数列表
{IS|AS}
[local_declarations]--局部声明
BEGIN
executable_statements--可执行语句
[EXCEPTION]
[exception_handlers]--异常处理程序
END [procedure_name]
2)调用储存过程
1)用命令调用
EXEC[UTE] procadure_name (procadure_list);
参数传递:
1、按位置传参
2、按名称传参
3、或者方式传参
2)在PL/SQL块中调用
3)储存过程的参数模式
parameter_name [IN | OUT | IN OUT] datatype [{:= | DEFAULT} expression]
4)储存过程的访问权限
管理员和当前用户可用,其他用户调用需获得EXECUTE权限
5)删除储存过程
DROP PROCEDURE procedure_name;
3.4.3 储存过程的调试和跟踪
1、在SQL*Plus下调试
2、使用PL/SQL Developer工具调试
3.4.4 储存过程规范
7条(教材96页)
第三章 PL/SQL编程的更多相关文章
- ORACLE PL/SQL 实例精解之第三章 PL/SQL中的SQL
3.1 在PL/SQL中使用DML 在PL/SQL语块中,两种变量赋值a. := 初始化.b. select into语法,PL/SQL语块的声明部分被声明的变量,后期可以使用选择语句进行赋值. 3. ...
- PL/SQL编程基础(三):数据类型划分
数据类型划分 在Oracle之中所提供的数据类型,一共分为四类: 标量类型(SCALAR,或称基本数据类型) 用于保存单个值,例如:字符串.数字.日期.布尔: 标量类型只是作为单一类型的数据存在,有的 ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- ORACLE PL/SQL编程详解(转)
原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...
- pl/sql编程
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- ORACLE PL/SQL编程之八:把触发器说透
原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
随机推荐
- 4052: [Cerc2013]Magical GCD
4052: [Cerc2013]Magical GCD Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 148 Solved: 70[Submit][ ...
- 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐
1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 432 Solved: 270[ ...
- STC-单片机控制系统
电源测量命令 60V开 FD02060001010100000060V关 FD02060002010100000060V保开 60V保关 -8KV开 -8KV关 FD02092802010201000 ...
- Servlet 与 Ajax 交互一直报status=parsererror
原因:servlet 返回的数据不是 Json 格式 1.JS代码为: var jsonStr = {'clusterNum':2,'iterationNum':3,'runTimes':4}; $. ...
- WebSocket数据包协议详解
其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分. ...
- 使用shape来定义控件的一些显示属性
Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结 先看下面的代码: <shape> <!-- 实心 -- ...
- Python的字典dictionary
创建: dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};删除: del dict['Name']; # 删除键是'Name'的条目 dict.c ...
- 混合拉普拉斯分布(LMM)推导及实现
作者:桂. 时间:2017-03-21 07:25:17 链接:http://www.cnblogs.com/xingshansi/p/6592599.html 声明:欢迎被转载,不过记得注明出处哦 ...
- 关于php的flush在本机正常在服务器不灵的问题
这个问题网上很多,我就不重复那些了. 我的是关于进度条的应用.我最后遇到的问题是,在本机swampserver环境下的输出缓存很快,但是到了服务器上就是一段一段的了.我的服务器是Web服务器是IIS. ...
- (转)CentOS下一键安装GitLab
[环境准备]OS: CentOS 6.3 x86_64 [安装要求]如果有条件,提供一台全新的Server(仅仅只安装了一些系统的软件包),可以直接使用一键安装脚本(gitlab-install-el ...