【Oracle】第四章异常处理

第四章异常处理

PL/SQL 块是构成 PL/SQL 程序的基本单元

将逻辑上相关的声明和语句组合在一起

PL/SQL 分为三个部分,声明部分、可执行部分和异常处理部分

[DECLARE

declarations]

BEGIN

executable statements

[EXCEPTION

handlers]

END;

以下示例演示了如何使用PL/SQL 语句:

declare

area integer;

width integer;

height integer;

currentdate date;

cnumber constant integer := 10;

begin

area :=10;

height :=2;

width := area/height;

currentdate :=sysdate;

DBMS_OUTPUT.put_line(‘宽 = ‘||width);

DBMS_OUTPUT.put_line(‘高 =‘||height);

DBMS_OUTPUT.put_line(‘面积 =‘||area);

DBMS_OUTPUT.put_line(‘常量的值为:‘||cnumber);

DBMS_OUTPUT.put_line(‘当前时间为:‘||currentdate);

exception

when zero_divide then

DBMS_OUTPUT.put_line(‘除数不能为零‘);

end;

给变量赋值有两种形式:

使用赋值语句 :=

使用 SELECT INTO 语句

使用常量赋值:

cnumber constant integer := 10;

以下代码演示了使用常量和SELECT INTO 语句:

declare

firstName varchar2(20);

lastName varchar2(20);

employeeid number;

consNumber constant integer  :=1000;

begin

select employee_id, first_name,last_name into employeeid, firstName,lastname from employees2 where employee_id =1;

DBMS_OUTPUT.put_line(‘consNumber = ‘||consNumber);

DBMS_OUTPUT.put_line(‘employeeid=‘||firstName);

DBMS_OUTPUT.put_line(‘firstName=‘||firstName);

DBMS_OUTPUT.put_line(‘lastName=‘||lastname);

end;

CLOB数据类型的使用。

create table my_book_text(

chapter_id number(3),

chapter_descr varchar2(40),

chapter_text clob);

添加数据到clob字段 chapter_text :

insert into my_book_text values(5,‘第五章 PL/SQL 简介‘,‘PL/SQL 可用于创建存储过程,触发器和程序包等,用来处理业务规则,数据库时间或给SQL命令的执行添加程序逻辑。‘);

读取 CLOB 数据类型:

set serveroutput on

declare

clob_var clob;

amount integer;

offset integer;

output_var varchar2(100);

begin

select chapter_content into clob_var from my_book_text where chapterid=1;

amount :=20;

offset :=5;

DBMS_LOB.READ(clob_var,amount,offset,output_var);

DBMS_OUTPUT.put_line(output_var);

end;

/

PL/SQL 支持的流程控制结构:

条件控制

IF 语句

CASE 语句

循环控制

LOOP 循环

WHILE 循环

FOR 循环

顺序控制

GOTO 语句

NULL 语句

以下代码演示了条件控制(IF-THEN-ELSE语句):

declare

age number(8);

begin

age := &age;

if age>20 and age<30 then

dbms_output.put_line(‘年龄在20 和30 之间 ‘);

elsif age < 20 then

dbms_output.put_line(‘年龄小于20‘);

else

dbms_output.put_line(‘年龄大于30‘);

end if;

end;

/

以下代码演示了从 employees2 表中检索employee_id 为 3 的记录 ,如果 salary 大于 15000 则减去 1000 ,否则salary 加 100

declare

firstName varchar(20);

lastName varchar2(20);

salarytemp number(10);

begin

select first_name,last_name,salary into firstName,lastName,salarytemp from employees2 where employee_id=3;

if salarytemp > 15000 then

update employees2 set salary = salary-1000 where employee_id = 3;

else

update employees2 set salary = salary+100 where employee_id=3;

end if;

dbms_output.put_line(‘firstName =‘||firstName);

dbms_output.put_line(‘lastName=‘||lastName);

dbms_output.put_line(‘salarytemp = ‘||salarytemp);

end;

Case 语句:

以下代码演示了选择器。系统先计算选择器值。然后再依次选择 WHEN 子句。

set serveroutput on

begin

case ‘&grade‘

when ‘A‘ then dbms_output.put_line(‘优异‘);

when ‘B‘ then dbms_output.put_line(‘优秀‘);

when ‘C‘ then dbms_output.put_line(‘良好‘);

when ‘D‘ then dbms_output.put_line(‘一般‘);

when ‘E‘ then dbms_output.put_line(‘较差‘);

else dbms_output.put_line(‘没有此成绩‘);

end case;

end;

/

Loop 循环:以下代码演示了loop的使用

declare

x number;

begin

x :=0;

loop

x:=x+1;

if x>=3 then

exit;

end if;

dbms_output.put_line(‘循环体 x =‘||x);

end loop;

dbms_output.put_line(‘循环体外 x =‘||x);

end;

/

另外一种表现形式:

declare

x number;

begin

x :=0;

loop

x:=x+1;

exit when x>=3;

dbms_output.put_line(‘循环体内 x =‘||x);

end loop;

dbms_output.put_line(‘循环体外 x =‘||x);

end;

While循环:

declare

x number ;

begin

x:=0;

while x<=3 loop

x:=x+1;

dbms_output.put_line(‘循环内‘||x);

end loop;

dbms_output.put_line(‘循环外‘||x);

end;

/

以下代码演示了while 循环得使用。声明了销量的 monthly_value 和 daily_value,并将其初始化为0。While执行循环,直至每月销量的值大于等于4000

set serveroutput on

declare

monthly_value number :=0;

daily_value number :=0;

begin

while monthly_value <= 4000

loop

monthly_value := daily_value * 31;

daily_value := daily_value +10;

dbms_output.put_line(‘每日销量:‘ || daily_value);

end loop;

dbms_output.put_line(‘每月销量‘ || monthly_value);

end;

/

For循环语句:

begin

for i in 1..5 loop

dbms_output.put_line(‘循环 I 的值 = ‘||i);

end loop;

dbms_output.put_line(‘end loop‘);

end;

/

Reverse(递减) 的使用

begin

for i in reverse 1..5 loop

dbms_output.put_line(‘循环 I 的值 = ‘||i);

end loop;

dbms_output.put_line(‘end loop‘);

end;

/

以下代码显示了25个偶数

set serveroutput on

begin

for eve_number in 1..25

loop

dbms_output.put_line(eve_number*2);

end loop;

end;

/

Oracle 中异常的处理:

预定义异常:

返回多行异常:

declare

firstname varchar2(20);

begin

select first_name into firstname from employees2 where division_id =‘SAL‘;

dbms_output.put_line(‘first_name=‘ || firstname);

exception

when too_many_rows then

dbms_output.put_line(‘不能返回多行数据‘);

end;

/

用户自定义异常:

以下代码演示了用户接受输入的类别。IF 语句将用户输入的类别与指定的类别相匹配。如果指定的类别中不存在将引发typeException 异常

declare

typeException exception;

temptype varchar2(20);

begin

temptype :=‘&type‘;

if temptype not in (‘java‘,‘c++‘,‘c#‘) then

raise typeException;

else

dbms_output.put_line(‘temptype = ‘||temptype);

end if;

exception

when typeException then

--dbms_output.put_line(‘没有找到相应的类型‘);

raise_application_error(-20000,‘没有找到相应的类型‘);

end;

存储过程的使用:

过程是执行某些操作的子程序,它是执行特定任务的模块,它可以被赋予参数,存储在数据库中。以下代码

1. 创建存储过程语法:

CREATE [OR REPLACE] PROCEDURE

<procedure name> [(<parameter list>)]

IS|AS

<local variable declaration>

BEGIN

<executable statements>

[EXCEPTION

<exception handlers>]

END;

以下代码演示了如何创建一个不带参数的存储过程:

create or replace procedure pro_emp

as

firstName varchar2(20);

lastName varchar2(20);

salary number(20);

begin

select first_name,last_name,salary into firstName,lastName,salary from employees2 where employee_id = 1;

dbms_output.put_line(‘firstName = ‘||firstName);

dbms_output.put_line(‘lastName = ‘ ||lastName);

dbms_output.put_line(‘salary = ‘ ||salary);

exception

when no_data_found then

dbms_output.put_line(‘数据没有找到‘);

end;

执行以上存储过程:

execute  pro_emp ;

过程参数模式:参数传递的模式有三种IN , OUT , IN OUT

IN      是参数的默认模式,这种模式定义的参数在程序运行的时候已经具有值,在过程序体中这个值不会改变。

OUT    模式定义的参数只在过程内部赋值。

IN OUT  模式定义的参数当过程运行时可能已经具有值,但是在过程体中也可以修改

以下创建了带参数的过程:

create or replace procedure mypro(employeeid in number,divisionid in out va

rchar2,jobid out varchar2)

as

tempdivid varchar2(20);

tempjobid varchar2(20);

begin

select division_id,job_id into tempdivid,tempjobid from employees2 where

employee_id =employeeid;

divisionid :=tempdivid;

jobid :=tempjobid;

end;

执行以上过程:

declare

cdivisionid varchar2(20);

cjobid varchar2(20);

cempid number(10);

begin

cempid :=1;

mypro(cempid,cdivisionid,cjobid);

dbms_output.put_line(‘...... cdivisionid = ‘||cdivisionid);

dbms_output.put_line(‘...... cjobid = ‘||cjobid);

end;

/

Oracle中的函数:

以下代码创建了函数:

create or replace function myfun(empid number)

return varchar2 is

firstName varchar2(20);

lastName varchar2(20);

begin

select first_name,last_name into firstName,lastName from employees2 where

employee_id = empid;

return ‘firstName = ‘||firstName ||‘   lastName = ‘||lastName;

end;

/

执行以上函数:

declare

fid number(8);

info varchar2(100);

begin

fid :=1;

info :=myfunction(1);

dbms_output.put_line(‘info =‘||info);

end;

/

时间: 2024-10-26 21:48:35

【Oracle】第四章异常处理的相关文章

Java基础知识二次学习--第四章 异常

第四章 异常处理 时间:2017年4月26日11:16:39~2017年4月26日11:28:58 章节:04章_01节 04章_02节 视频长度:20:46+01:16 内容:异常的概念 心得: Java异常是JAVA提供的用于处理程序中错误的一种机制 实在运行的过程中发生的一些异常事件(比如除0溢出,数组越界,要读取的文件不存在) 设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果 JAVA程序的执行过程中 如果出现异常事件,可以生成异

oracle基本语句(第四章、数据库安全管理)

1.用SYS用户以SYSDBA身份登录SQL Plus,使用DBA_USERS视图查看用户信息: SELECT USERNAME, ACCOUNT_STATUS, CREATED FROM DBA_USERS;--用户名,账户状态,创建用户的日期 2.创建用户.删除用户 CREATE USER <用户名> IDENTIFIED BY<口令> DEFAULT TABLESPACE <默认表空间> TEMPORARY TABLESPACE <临时表空间>; --

【书评:Oracle查询优化改写】第四章

[书评:Oracle查询优化改写]第四章 BLOG文档结构图 一.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① check的特殊用法 ② sql优化中使用merge语句代替update语句(重点) 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 一.2 实验环境介绍 目标库:11.2.0.3  RHEL6.5 一.3 前言 前3章的链接参考相关连接: [书评:Orac

第四章 初步进入linux世界

第四章 初步进入linux世界 [Linux 系统启动过程] Linux的启动其实和windows的启动过程很类似,不过windows我们是无法看到启动信息的,而linux启动时我们会看到许多启动信息,例如某个服务是否启动. Linux系统的启动过程大体上可分为五部分:内核的引导:运行init:系统初始化:建立终端 :用户登录系统. A 内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动.紧接着由启动设备上的grub程序开始引导linux,当引

C和指针 (pointers on C)——第四章:语句(上)

第四章--语句(上) 总结总结!!! C没有布尔类型,所以在一些逻辑判断时候必须用整型表达式,零值为假,非零值为真. for比while把控制循环的表达式收集起来放在一个地方,以便寻找. do语句比while语句类似,但是前者能够保证循环体至少执行一次. 不要用goto. switch...case...在没有加break时候多半有问题,我有一篇文章曾专门说这个事儿. 详情见http://blog.csdn.net/liyakun1990/article/details/24942191 空语句

Java Persistence with MyBatis 3(中文版) 第四章 使用注解配置SQL映射器

在上一章,我们看到了我们是怎样在映射器Mapper XML配置文件中配置映射语句的.MyBatis也支持使用注解来配置映射语句.当我们使用基于注解的映射器接口时,我们不再需要在XML配置文件中配置了.如果你愿意,你也可以同时使用基于XML和基于注解的映射语句. 本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l 动态SQL @SelectProvi

Head First Python 第二章 函数模块&amp;第三章 文件与异常&amp;第四章 持久存储&amp;第五章 处理数据

第三章 1.共享模块 模块和发布工具箱全世界共享模块 编写函数,以.py为文件后缀名,第三方库都在PyPI *注释代码:三引号(单双都可以) 发布过程P40 使用发布工具,函数模块变成了一个“发布”,可以使用import导入其他程序 2.如果函数模块功能不满意 添加参数以供api选择比添加函数工作量小! 首先考虑BIF内置函数 ----------------------------------------------------------- 第四章 1.文件 open()语句,readlin

淘宝技术这十年 第三章 第四章

到 2004 年上半年,淘宝决定更换开发语言,将PHP更改为JAVA: ? ? 到07年,淘宝已经用上了 IBM 的小型机.Oracle 的数据库.EMC 的存储 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第四章 ? ? 07年之后,淘宝就开始了真正的壮大之路,走上了创造技术的大道: ? ? 07年之前,图片存储使用的是NetAPP的文件存储系统,但未对小文件存储进行有针对的优化 ,且扩容成本高昂,网络连接数经常达到极限: ? ? ? ? 在这种背景下,淘宝

Java(第四章和第五章)

第四章 一.             switch结构(开关语句)的语法 switch(表达式[dream1] ){ case  常量1[dream2] : //语句块1 break[dream3] ; case  常量n[dream4] : //语句块n break; default[dream5] : //语句块 break; } 二.             switch结构使用场合:   int \char  2种类型的等值判断下使用 三.             switch结构和if