pl/sql 笔记之基础(上)

  由于公司中使用 oracle,而本人对存储过程一直也懵懵懂懂,故一周时间学习了一遍 pl/sql,在此记下笔记!!!

一、前提,pl/sql 是啥?
1、PL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。
2、由于该语言集成于数据库服务器中, 所以PL/SQL代码可以对数据进行快速高效的处理。
3、PL/SQL 是 ORACLE 系统的核心语言,现在 ORACLE 的许多部件都是由 PL/SQL 写成。
4、在 PL/SQL 中只能用 SQL 语句中的 DML 部分,不能用 DDL 部分,如果要在 PL/SQL 中使用 DDL(如CREATE table 等)的话,只能以动态的方式来使用。
 
二、pl/sql 基本语法
1、pl/sql 块
① PL/SQL 程序由三个块组成,即声明部分、执行部分、异常处理部分。结构如下(像极了java方法啊 ):
 
DECLARE
/* 声明部分: 在此声明 PL/SQL 用到的变量,类型及游标,以及局部的存储过程和函数 */
BEGIN
/* 执行部分: 过程及 SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分: 错误处理 */
END;

 

② 一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果
 
2、变量类型: 基本变量类型、复合类型(记录、表)
① 记录类型: 存放互不相同但逻辑相关的信息。(好像C语言的结构体啊)
-- 声明记录类型
TYPE record_type_test IS RECORD (
v_name employees.last_name%TYPE,
salary NUMBER
);
-- 定义记录类型变量
v_record_type_test record_type_test;
 
-- %ROWTYPE 操作符, 返回一个记录类型, 我理解为表的一行
v_emp employees%ROWTYPE;
② 表类型: 用来记录一张表的好多行
3、流程控制

4、 游标:
游标是一个指向上下文的句柄( handle)或指针。在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现。
  问:什么时候用这么麻烦的显示游标?
  答:SELECT INTO、INSERT、UPDATE、DELETE 均用隐式游标。
    显示游标用于专门处理select语句返回多行数据。
 
4.1、显式游标
4.11 步骤: 定义游标、打开游标、提取游标数据、关闭游标
eg : 查询前 10 名员工的信息。
4.12、显式游标属性
 
%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为 TRUE;
%NOTFOUND 布尔型属性,与%FOUND 相反;
%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;
%ROWCOUNT 数字型属性,返回已从游标中读取的记录数。
 
4.13、游标for 循环
  游标 FOR 循环语句,自动执行游标的 OPEN、 FETCH、 CLOSE 语句和循环语句的功能;当进入循环时,游标 FOR 循环语句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数据而进入下一次循环时,游标 FOR 循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标。
4.2、隐式游标
对于单条select、INSERT、UPDATE、DELETE 操作, 则由 ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标。
 
4.2.1、隐式游标属性
SQL%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为 TRUE;
SQL%NOTFOUND 布尔型属性,与%FOUND 相反;
SQL %ROWCOUNT 数字型属性, 返回已从游标中读取得记录数;
SQL %ISOPEN 布尔型属性, 取值总是 FALSE。 SQL 命令执行完毕立即关闭隐式游标。
 
4.2.2、 eg、删除指定员工

注意:
1、如果游标打开之前或关闭之后,使用游标属性,Oracle会抛出一个INVALID_CURSOR错误(ORA-01001);
2、如果在第一次fetch后结果集是空的,%found=false,%NotFound=true,%ROWCOUNT=0;
3、如果使用了BULK COLLECT,那么%ROWCOUNT的值可能不是0或1,实际上他返回的是提取到相关集合的行数。
4、游标修改和删除操作是指在游标定位下,修改或删除表中指定的数据行。这时, 要求游标查询语句中必须使用 FOR UPDATE 选项,来对所选择的行进行锁住。用法:
5、SELECT … INTO 语句触发 NO_DATA_FOUND;
  当 UPDATE 或 DELETE 或显式游标语句的 WHERE 子句未找到时触发 SQL%NOTFOUND;
 
三、异常处理
pl/sql 有三种类型的异常错误:
 
1. 预定义 ( Predefined )错误
ORACLE 预定义的异常情况大约有 24 个。对这种异常情况的处理,无需在程序中定义, 由 ORACLE 自动将其引发。
 
2. 非预定义 ( Predefined )错误
即其他标准的 ORACLE 错误。对这种异常情况的处理,需要用户在程序中定义,然后由 ORACLE 自动将其引发。

eg、

3. 用户自定义(User_define) 错误
程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理, 需要用户在程序中定义,然后显式地在程序中将其引发。
eg:

 

posted @ 2017-04-24 20:56  skillking2  阅读(312)  评论(0编辑  收藏  举报