由于公司中使用 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:

pl/sql 笔记之基础(上)的更多相关文章

  1. PL/SQL在Oracle服务器上连接出错

    今天在Oracle服务器上使用PL/SQL连接Oracle软件的时候出现了错误,错误如下: 具体的解决办法如下: 需要下载32位的Oracle Client,具体的步骤如下:登录Oracle官方网站 ...

  2. pl/sql 笔记之存储过程、函数、包、触发器(下)

    一.存储过程.存储函数   1.What's This? ①.ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. ②.存储过程.存储函数的唯 ...

  3. Oracle PL/SQL编程之基础

    1.简介:pl/sql块由三个部分组成:定义部分.执行部分.例外处理部分,如下所示: declare: /*定义部分---定义常量.变量.游标.例外.复杂数据类型 begin /*执行部分---要执行 ...

  4. PL SQL笔记(三)

    loop then .. exit; end if; end loop; select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual; sel ...

  5. pl/sql developer 连接服务器上的数据库

    1, 在本地安装的Oracle中找到目录 oracle\product\11.2.0\dbhome_1\network\admin, 它下面一般有两个文件可以进行编辑tnsnames.ora   li ...

  6. Oracle PL/SQL学习之基础篇(1)

    1.PL/SQL,全称Procedure Language/SQL,过程化sql语言 PL/SQL的程序结构 declare --声明部分(包括变量.光标.例外声明) begin --语句序列(DML ...

  7. PL/SQL笔记(一)

    PL/SQL概述 PL/SQL是一种高级的数据库程序设计语言,专门使用与Oracle语言基于数据库的服务器的内部,所以PL/SQL代码可以对数据库进行快速的处理. 1.什么是PL/SQL? PL/SQ ...

  8. SQL笔记:基础篇

    1.BETWEEN AND (查询某个区间的数据) 例如:查询user表中年龄在15-30岁的人 SELECT * FROM user WHERE age between 15 and 30 2.IN ...

  9. Oracle PL/SQL学习之基础篇(2)--例外

    1.例外分类:系统例外.自定义例外 (1)系统例外,参见相关API文档 (2)自定义例外 定义自己的例外:就像自定义变量一样,类型为exception 抛出例外:使用raise抛出自定义例外 set ...

随机推荐

  1. C++学习 之 初识变量和基本类型 之 内置类型

    声明:            本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...

  2. SVN图标详解

    蓝色的加号 : 把这个文件已经添加到版本控制软件内 绿色的对勾 : 客户端和服务器端的代码一致 红色的叹号 : 客户端和服务器端两边的代码不一致 黄色的叹号 : 文件冲突 蓝色的问号 : 这个文件不在 ...

  3. Linux性能分析之上下文切换

    而在每个任务运行前,CPU 都需要知道任务从哪里加载.又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器 CPU 寄存器,是 CPU 内置的容量小.但速度极快的内存.而程序 ...

  4. 转: zepto的使用方法

    有些不了解zepto的同学在刚接触的时候肯定有很多疑惑,这个东西怎么用啊,去哪里下载啊,什么时候该用什么时候不该用啊,其实我以前也是这样的.jquery使用多了那么就让我们一起来了解下zepto把. ...

  5. jenkins+git+gitlab+ansible实现持续集成自动化部署

    一.环境配置 192.168.42.8部署gitlab,节点一 192.168.42.9部署git,Jenkins,ansible服务器 192.168.42.10节点二 二.操作演示 ①gitlab ...

  6. django中使用mysql数据库

    django连接mysql 安装MySQL 1 linux: apt install mysql-server apt install mysql-client mysql_secure_instal ...

  7. vlc 控件属性和方法

    VLC调研 VLC控件支持的参数和方法 VLC对象列表 Vlc Plugin Object的方法 l        VersionInfo:成员, 返回版本信息的字符串 l        vlc.ve ...

  8. HBITMAP与BITMAP 的区别

    HBITMAP   是句柄:  BITMAP    是实例:    typedef   struct   tagBITMAP {             LONG       bmType;      ...

  9. Django-ORM之ManyToManyField的使用-多对多关系

    表结构设计 多对多关系表创建外键,典型例子:书--作者--出版社,书与作者的关系就可以看作是多对多关系. # 表结构设计 class Book(models.Model): title = model ...

  10. 面试题 :10亿url去重只给4G内存

    我能想到的有以下几种: 用语言判断去重,ex表格去重,数据库去重,文件名字去重, 有人说:10亿url ex表放不下!! 可以用树和折半的思想将10亿url,变成单元最小化的树,然后用ex表去重 ex ...