设为首页 加入收藏

TOP

(韩顺平讲解)pl/sql编程(二)(一)
2015-07-24 11:52:15 来源: 作者: 【 】 浏览:11
Tags:顺平 讲解 pl/sql 编程
一、pl/sql进阶―控制结构
pl/sql中提供了三种条件分支语句 if -- then, if --then---else, if---then---elsif---else
(1)简单的条件判断 if ? then
问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增加10%。
Sql代码
1. create or replace procedure sp_pro6(spName varchar2) is
2. --定义
3. v_sal emp.sal%type;
4. begin
5. --执行
6. select sal into v_sal from emp where ename=spName;
7. --判断
8. if v_sal<2000 then
9. update emp set sal=sal+sal*10% where ename=spName;
10. end if;
11. end;

(2)二重条件分支 if―then--else
问题:编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200;
Sql代码
1. create or replace procedure sp_pro6(spName varchar2) is
2. --定义
3. v_comm emp.comm%type;
4. begin
5. --执行
6. select comm into v_comm from emp where ename=spName;
7. --判断
8. if v_comm<>0 then
9. update emp set comm=comm+100 where ename=spName;
10. else
11. update emp set comm=comm+200 where ename=spName;
12. end if;
13. end;

(3)多重条件分支 if--then--elsif--else
问题:编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其它职位的雇员工资增加200。
Sql代码
1. create or replace procedure sp_pro6(spNo number) is
2. --定义
3. v_job emp.job%type;
4. begin
5. --执行
6. select job into v_job from emp where empno=spNo;
7. if v_job='PRESIDENT' then
8. update emp set sal=sal+1000 where empno=spNo;
9. elsif v_job='MANAGER' then
10. update emp set sal=sal+500 where empno=spNo;
11. else
12. update emp set sal=sal+200 where empno=spNo;
13. end if;
14. end;

二、循环语句 ?while循环?
基本循环至少要执行循环体一次,而对于while循环来说,只有条件为true时,才会执行循环体语句,while循环以while...loop开始,以end loop结束。
问题:请编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从11开始增加。
Sql代码
1. create or replace procedure sp_pro6(spName varchar2) is
2. --定义 :=表示赋值
3. v_num number:=11;
4. begin
5. while v_num<=20 loop
6. --执行
7. insert into users values(v_num,spName);
8. v_num:=v_num+1;
9. end loop;
10. end;

三、顺序控制语句-goto ,null
①goto语句
goto语句用于跳转到特定标号去执行语句.注意由于使用goto语句会增加程序的复杂性,并使得应用程序可以读性变差,所以在做一般应用开发时,建议大家不要使用goto语句.
基本语法如下 goto lable,其中lable是已经定义好的标号名.
declare
i int :=1;
begin
loop
dbms_output.put_line(‘输出i=‘||i);
if i=10 then
goto end_loop;
end if;
i:=i+1;
end loop;
<>
dbms_output.put_line('循环结束');
end;
注意:--in:表示这是一个输入参数,默认为in
--out:表示一个输出参数

四、oracle视图
创建视图
create view 视图名 as select语句 [with read only]
创建或修改视图
create or replace view 视图名 as select语句 [with read only]
删除视图
drop view 视图名

五、pl/sql进阶―例外处理
Exception
When <异常情况名>then
<异常处理代码>
When <异常情况名>then
<异常处理代码>
……
when others then
<异常处理代码>
例外情况名 错误代码 描述
NO_DATA_FOUND ORA-01403 对于SELECT 叙述没有传回任何值。
TOO_MANY_ROWS ORA-01427 只允许传回一笔记录的SELECT 叙述结果却多于一笔。
INVALID_CURSOR ORA-01001 使用非法的的光标操作。
VALUE_ERROR ORA-06502 出现数值、数据形态转换、撷取字符串或强制性的错误。
INVALID_NUMBER ORA-01722 字符串到数值的转换失败。
ZERO_DIVIDE ORA-01476 被零除。
DUP_VAL_ON_INDEX ORA-00001 试图向具有唯一键值的索引中插入一个重复键值。
CASE_NOT_FOUND ORA-xxxxx 没有case条件匹配

CURSOR_NOT_OPEN ORA-xxxxxx 游标没有打开

各种案例:
1.请写一个过程,可以向book表添加书,要求通过java程序调用该过程。
--编写过程
Sql代码
create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is
begin
insert into book values(spBookId,spbookName,sppublishHouse);
end;
--在java中调用

package com.oracle.demo;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;

public class Procedure_07_Test {
	
	public static void main(String[] args) {
		try {
			
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection co
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇"oracle Universal Installe.. 下一篇sql基础之DDL(DataDefinitionLang..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Announcing October (2025-12-24 15:18:16)
·MySQL有什么推荐的学 (2025-12-24 15:18:13)
·到底应该用MySQL还是 (2025-12-24 15:18:11)
·进入Linux世界大门的 (2025-12-24 14:51:47)
·Download Linux | Li (2025-12-24 14:51:44)