Oracle中PL/SQL的执行部分和各种流程控制
Oracle中PL/SQL的执行部分和异常部分
一.PL/SQL的执行部分。
赋值语句。
赋值语句分两种,一种是定义一个变量,然后接收用户的IO赋值;另一种是通过SQL查询结果赋值。
用户赋值举例:
set serveroutput on;
accept abc prompt '请输入abc的值';
DECLARE
a int:= &abc;
BEGIN
dbms_output.put_line(a);
END;
查询赋值举例:
set serveroutput on;
DECLARE
str varchar2(20);
BEGIN
select ename into str from emp where empno='7369';
dbms_output.put_line(str);
END;
- 流程控制语句。
PL/SQL的主要控制语句如下:
1.if...then elsif … then end if;
判断if正确则执行then,否则执行else(elsif为嵌套判断)
注意elsif,里面少一下e.
2.Case var when … then when … then end
有逻辑的从数值中做出选择
3.Loop exit end loop
循环控制,用判断语句执行exit
4.Loop exit when … end loop
同上,当when为真时执行exit
5.while..loop end loop
当while为真时循环
6.for...in...loop end loop
已知循环次数的循环
因为流程控制比较多,在这里就不一一举实例了,写几个比较经典的程序给大家看一下。
********打印9*9乘法表*********
for in..loop
set serveroutput on;
DECLARE
i number;
j number;
BEGIN
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(i||'*'||j||'='||(i*j)||' ');
end loop;
dbms_output.put_line('');
end loop;
END;
while loop
set serveroutput on;
declare
i number:=1;
j number:=1;
begin
while i<10 loop
while j<=i loop
dbms_output.put(i||'*'||j||'='||(i*j)||' ');
j:=j+1;
end loop;
i:=i+1;
j:=1;
dbms_output.put_line('');
end loop;
end;
*********计算1+2+..+10的值*********
loop exit & loop exit when
set serveroutput on;
declare
i number:=1;
i_sum number:=0;
begin
loop
i_sum:=i_sum+i;
i:=i+1;
if i>10 then
exit;
end if;
end loop;
dbms_output.put(i_sum);
dbms_output.put_line('');
end;
注意:put只是把输出结果放入缓冲区,直到遇到put_line时才会输出。所以只有put的时候,不会显示i_sum的结果。
可以把 if i>10 then exit; end if; 换成exit when i>10;这样就成为了loop ..exit when .. end loop 结构。
*********输入一个字符,判断是字母、数字还是其他字符****************
if then elsif else
set serveroutput on;
declare
i_char varchar2(2);
begin
i_char:=&abc;
if regexp_like(i_char,'^[a-z]$') then
dbms_output.put_line('输入的是字母');
elsif regexp_like(i_char,'^[0-9]$') then
dbms_output.put_line('输入的是数字');
else
dbms_output.put_line('输入的是其他字符');
end if;
end;
case when
set serveroutput on;
declare
i_char varchar2(2);
i_result varchar2(30);
begin
i_char:=&abc;
i_result:=
case
when regexp_like(i_char,'^[a-z]$') then
'输入的是字母'
when regexp_like(i_char,'^[0-9]$') then
'输入的是数字'
else
'输入的是其他字符'
end;
dbms_output.put_line(i_result);
end;
注意:在提示窗口中输入的时候,字符串一定要加单引号,否则就会出错,本人每次在这里都要拌一下。
- SQL语句
SQL语句就是数据库查询语句,比较简单就不在这里说了。
- 游标语句
二.异常部分。
数据库中的异常跟java中的异常的机制和作用原理是一样的,只是代码和格式不一样,数据库中的异常分为三类:系统异常(预定义异常)、自定义异常以及引发应用程序异常。
- 系统异常
例如:无法建立到Oracle的连接或用0做除数。好的程序应该对可能发生的异常情况进行处理,异常处理代码在EXCEPTION块中实现
可以使用WHEN语句来定义异常。WHEN语句的使用方法如下:
EXCEPTION
WHEN <异常情况名> THEN
<异常处理代码>
WHEN <异常情况名> THEN
<异常处理代码>
...
WHEN OTHERS THEN
<异常处理代码>
常见的系统异常
| 异常名称 | 异常码 | 说明 |
| NO_DATA_FOUND | ORA-01403 | select into语句中没有返回任何记录 |
| TOO_MANY_ROWS | ORA-01422 | select into语句中返回多行数据。 |
| ZERO_DIVDE | ORA-01476 | 试图用0作为除数。 |
| DUP_VAL_ON_INDEX | ORA-00001 | 试图向唯一索引列插入重复值 |
| INVALID_CURSOR | ORA-01001 | 试图进行非法游标操作。 |
| CURSOR_ALREADY_OPEN | ORA-06511 | 试图打开一个已经打开的游标。 |
| INVALID_NUMBER | ORA-01722 | 试图将数字转换为字符串。 |
| VALUE_ERROR |
在产生大小限制错误时出现。如,变量中的列值超出变量的大小 |
|
|
LOGIN_DENIED |
输入的用户名或者密码无效时出现。 |
- 自定义异常
当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。
对于这类异常情况的处理,步骤如下:
在PL/SQL 块的定义部分定义异常情况:
<异常名称> exception;
在PL/SQL 块的执行部分RAISE异常:
RAISE <异常名称>;
在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。
WHEN <异常名称> THEN
代码...
- 引发应用程序异常
Oracle中PL/SQL的执行部分和各种流程控制的更多相关文章
- Oracle中PL/SQL简介、基本语法以及数据类型
Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...
- 使用oracle 的 PL/Sql 定时执行一个存储过程
CSDN日报20170322--<关于软件研发的一些体会总结> 同步博客至 CSDN ,让更多开发者看到你的文章 看微博技术大咖解析互联网应用架构实战 使用oracle 的 PL/Sql ...
- Oracle中PL/SQL的循环语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- Oracle中PL/SQL 范例
1.写匿名块,输入三角形三个表的长度.在控制台打印三角形的面积 declare v_side_first ):=&第一条边; v_side_second ):=&第二条边; v_sid ...
- oracle中pl/sql 练习题----输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)
一. 思路:声明record类型的变量,根据 多表联合查询查出想要的数据,最后输出. 二.注意:record类型不一定只是一个表中的数据,也可以声明不同表中的数据类型. 三.语句如下: declare ...
- oracle中动态SQL详解
部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...
- oracle中动态SQL使用详细介绍
Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下 1.静态SQLSQL与动态SQL Oracle编译PL ...
- (转)Oracle中动态SQL详解
本文转载自:http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html 1.静态SQLSQL与动态SQL Oracle编译PL ...
- [转载]Oracle中动态SQL详解
1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一 ...
随机推荐
- a0=1、a1=1、a2=a1+a0、a3=a2+a1,以此类推,请写代码用递归算出a30?
public class Test { public static void main(String[] args) { System.out.println(recursive(30)); } pu ...
- Mysql Error: Host ‘xxx.xxx.xxx.xxx’ is not allowed to connect to
1.打开cmd控制台 2. mysql -u root -p 输入密码 3. mysql>grant all privileges on *.* to 'root' @'%' identifie ...
- 使用tomact监控应用服务器的性能
第一步:在D:\apache-tomcat-7.0.63\conf 配置目录找到tomcat-users.xml 打开添加用户角色及权限 第二步:重启tomact 第三步:浏览器上打开http://1 ...
- UVALive5031 Graph and Queries(Treap)
反向操作,先求出最终状态,再反向操作. 然后就是Treap 的合并,求第K大值. #include<cstdio> #include<iostream> #include< ...
- Hibernate关联关系的映射
实体之间的关系 实体之间有三种关系 一对多:一个用户,生成多个订单,每一个订单只能属于一个用户 建表原则:在多的一方创建一个字段,作为外键,指向一的一方的主键 多对多:一个学生可以选择多门课程,一个课 ...
- MIT 6.828 JOS学习笔记6. Appendix 1: 实模式(real mode)与保护模式(protected mode)
在我们阅读boot loader代码时,遇到了两个非常重要的概念,实模式(real mode)和保护模式(protected mode). 首先我们要知道这两种模式都是CPU的工作模式,实模式是早期C ...
- Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...
- 洛谷 P1026 统计单词个数 Label:dp
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- log4j日志文件 log4j.xml log4j.properties配置
1,导入log4j jar包; 2,配置log4j.xml或log4j.properties文件; ------------------------------------------------- ...
- LinkedList实现队列和堆栈的代码
package 集合; import java.util.LinkedList; /* *队列:先进先出 *把romovelast改成romoveFirst就成了堆栈 先进后出 * * */publ ...