PL/SQL(Procedural Language/SQL)是Oracle在数据库中引入的一种过程化编程语言。

PL/SQL块结构

  声明部分  执行部分(必须的)  异常处理部分

[declare]

  --声明部分,可选

BEGIN

  --执行部分,必须

[exception]

  --异常处理部分,可选

END

  单行注释:--

  多行注释:/*  */

基本数据类型:  

  number  varchar2  char  long  nchar nvarchar2  date  boolean

特殊数据类型:

  %type,声明一个与指定列名称相同的数据类型。

declare var_job emp.job%type;

  record:记录类型数据

type emp_type is record

(

var_ename varchar2(20),

var_job varchar2(20),

var_sal number

);

  %rowtype:结合了%type和record特性,可以根据数据表中的行结构定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据

rowVar_emp emp%rowtype;定义能够存储emp表中一行数据的变量rowVar_emp

定义变量:var_countryname varchar2(50):='中国';

定义常量:con_day constant integer:=365;

PL/SQL游标

显示游标和隐式游标:

显示游标:例子

1.声明一个检索emp表中雇员信息的游标,然后打开游标,并指定检索职务是“MANAGER"的雇员信息,接着使用 fetch...into语句和while循环
读取游标中的所有雇员信息,最后输出读取的雇员信息

declare
cursor cur_emp(var_job in varchar2:='SALESMAN')
is select empno,ename,sal
from emp
where job=var_job;
type record_emp is record
(
var_empno emp.empno%type,
var_ename emp.ename%type,
var_sal emp.sal%type
);
emp_row record_emp;
begin
open cur_emp('MANAGER');
fetch cur_emp into emp_row; --读取游标中内容,将游标指针移动到结果集中的第一行
while cur_emp%found loop
dbms_output.put_line(emp_row.var_ename||'的编号是'||emp_row.var_empno||',工资是'||emp_row.var_sal);
fetch cur_emp into emp_row;
end loop;
close cur_emp;
end;
/

游标属性:

  %found:如果SQL语句至少影响到一行数据,则该属性为true,否则为false

  %notfound:与上面的功能相反

  %rowcount:返回受影响的行数

  %isopen:游标打开时,返回true,关闭时,false

隐式游标

在执行一个SQL 语句时,Oracle会自动创建一个隐式游标。这个游标是内存中处理该语句的工作区域。

例子:

在SCOTT模式下,把emp表中销售员的工资上调20%,然后使用隐式游标sql的%rowcount属性输出上调
工资的员工数量

begin
update emp
set sal = sal*(1+0.2)
where job='SALESMAN';
if sql%notfound then
dbms_output.put_line('没有雇员调整工资');
else
dbms_output.put_line('有'||sql%rowcount||'个雇员工资上调20%');
end if;
end;
/

for语句循环游标:

例子:

使用隐式游标和for语句检索出职务是销售员的雇员信息并输出

begin
for emp_record in (select empno,ename,sal from emp where job='SALESMAN')
loop
dbms_output.put_line('雇员编号:'||emp_record.empno);
dbms_output.put_line('; 雇员名称:'||emp_record.ename);
dbms_output.put_line('; 雇员工资:'||emp_record.sal);
end loop;
end;
/

使用显示游标和for语句检索出部门编号是30的雇员信息并输出

declare
cursor cur_emp is
select * from emp
where deptno=30;
begin
for emp_record in cur_emp
loop
dbms_output.put('雇员编号:'||emp_record.empno);
dbms_output.put('雇员名称:'||emp_record.ename);
dbms_output.put_line('雇员职务:'||emp_record.job);
end loop;
end;
/

综上,在使用游标(隐式,显示)的for循环中,可以声明游标。但不用进行打开游标、读取游标、关闭游标等操作,这些由Oracle系统内部自动完成

 PL/SQL异常处理

在[exception]代码块中

根据异常产生的机制和原理,可将Oracle系统异常分为以下两大类:

1.预定义异常

  定义在Oracle的核心PL/SQL库中,用户可以在自己的PL/SQL异常处理部分使用名称对其进行标识。对这种异常情况的处理,用户无须在程序中定义,它们由Oracle自动引发。

系统预定义异常 说明
ZERO_DIVIDE 除数为零时引发的异常
ACCESS_INTO_NULL 企图为某个未初始化对象的属性赋值
COLLECTION_IS_NULL 企图使用未初始化的集合元素
CURSOR_ALREADY_OPEN 企图再次打开一个已经打开过的游标,但在重打开之前,游标未关闭
INVALID_CURSOR   执行一个非法的的游标操作,如,关闭一个未打开的游标
INVALID_NUMBER 企图将一个字符串转换成一个无效的数字而失败
LOGIN_DENIED 企图使用无效的用户名或密码连接数据库
NO_DATA_FOUND SELECT INTO 语句没有返回数据
ROWTYPE_MISMATCH 主游标变量与PL/SQL游标变量的返回类型不兼容
SELF_IS_NULL 使用对象类型时,使用空对象调用其方法
SUBSCRIPT_BEYOND_COUNT 元素下表超过嵌套表或VARRY中的元素
SUBSCRIPT_OUTSIDE_LIMIT 企图使用非法索引号引用嵌套表或VARRY中的元素
SYS_INVALID_ROWID 字符串向ROWID转换时的错误,因为该字符串不是一个有效的ROWID值
TIMEOUT_ON_RESOURCE Oracle在等待资源时超时
TOO_MANY_ROWS 执行SELECT INTO 语句时,结果集超过一行引发的异常

2.自定义异常

  有两种

A-错误编码异常

定义错误编码异常编号为“-00001”的异常变量,然后想dept表中插入一条能够“违反唯一性约束条件”的记录,

最后在exception代码中输出异常提示信息  

declare
primary_iterant exception;
pragma exception_init(primary_iterant,-00001);--关联错误号和异常变量名
begin
insert into dept values(10,'软件开发部','深圳');
exception
when primary_iterant then
dbms_output.put_line('主键不允许重复!');
end;
/

B-业务逻辑异常

自定义一个异常变量,在向dept表中插入数据时,若判断loc字段为null,则使用raise语句引发异常,

并将程序执行流程转入到exception部分进行处理

declare
null_exception exception;
dept_row dept%rowtype;
begin
dept_row.deptno:=66;
dept_row.dname:='公共部';
insert into dept
values(dept_row.deptno,dept_row.dname,dept_row.loc);
if dept_row.loc is null then
raise null_exception;
end if;
exception
when null_exception then
dbms_output.put_line('loc字段的值不许为null');
rollback;
end;
/

  

Oralce-PL/SQL编程-游标的更多相关文章

  1. PL/SQL编程—游标

    一.游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然 ...

  2. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  3. Pl/SQL 编程

    Pl/SQL 编程 一:前言 二:Pl/Sql 概述 二     ——  1: Pl/Sql块结构 [declare] --声明部分,可选 begin --执行部分,必须 [exception] -- ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. pl/sql编程

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  6. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  7. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  8. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  9. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  10. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

随机推荐

  1. C# 身份证号码验证正则和验证函数

    做身份证验证的时候要求能够按照标准18位身份证验证,普通正则表达式不能满足需求,所以在网上找到了这个函数,很好用,虽然还是有漏洞,不过一般乱填的号码都能被屏蔽掉 身份证验证函数(标准18位验证) pr ...

  2. Zepto v1.0-1源码注解

    /* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */ ;(funct ...

  3. TP50、TP90、TP99、TP999

    TP=Top Percentile,Top百分数,是一个统计学里的术语,与平均数.中位数都是一类.TP50.TP90和TP99等指标常用于系统性能监控场景,指高于50%.90%.99%等百分线的情况. ...

  4. topic模式下的收发

    生产者: import pika import sys connection = pika.BlockingConnection(pika.ConnectionParameters( host='lo ...

  5. Linux ssh的的用法

    Linux ssh的的用法 ssh执行远程命令 1. 执行命令 1.执行单条命令 ubuntu@node1:~$ ssh ubuntu@172.16.10.102 hostname ubuntu@17 ...

  6. Windows 下 MySQL 备份脚本

    @title MySQL备份脚本 @echo off @echo root@127.0.0.1:3306 set host=127.0.0.1 set port=3306 set user=root ...

  7. Tutorial2

    一.写一个tf2的broadcaster 本教程关于怎样broadcast一个机器人的坐标系到tf2上. 1.创建一个learning_tf2包 catkin_create_pkg learning_ ...

  8. 《YC创业营:硅谷顶级创业孵化器如何改变世界》:YC2011批量天使投资记录 三星推荐

    这个YC创业营是一个硅谷的天使投资基金,每年两次批量投资创业公司.本书说的是2011年YC批量选择了64个创业团队,让他们集中到硅谷办公3个月,给他们创业指导,帮他们找A轮投资. YC创始人偏爱25岁 ...

  9. redis开发规范阿里云

    一.键值设计 1.key名设计 1) 可读性和可管理性:  以业务名或数据库名为前缀,以防key冲突,用冒号分隔,比如业务名:表名:ID 2)简洁性: 保证语义的前提下,控制key的长度,当key较多 ...

  10. BZOJ3622 已经没有什么好害怕的了 二项式反演+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3622 题解 首先显然如果 \(n - k\) 为奇数那么就是无解.否则的话,"糖果& ...