`

oracle----块编程

阅读更多
1.块的构成:---这里不是存储过程哈。。。。
定义部分,执行部分,例外处理部分

declear --可选  相当于java   int a=1;定义部分啦

begin     --这里其实可以看成静态块,动态块,方法块 看成{ } 就可以了

execption --可选  在块里面当然可以try catch

end;     


2.实例2----打印hello wrold

set serveroutput on --打开输出选项
begin
  dbms_output.put_line('hello world'); //dbms_output是一个包,put_line是一个过程
end;


3.包含定义部分和执行部分
declare
  v_ename varchar2(5);   //相当于String ename;
  v_sal   number(7,2);
begin
  select ename ,sal into v_ename,v_sal from emp where empno=&no;
  dbms_output.put_line('雇员名:'||v_ename||'  工资'||v_sal);  
end;

&表示要接收从控制台输入的变量

注意:这里变量的目的是在多个执行部分可以用到,他可以跨越多条语句

------- 加上例外
注意:如果在控制台输入的参数,比如说empno=77在表里面查不到,那么就会将空值放到
变量里面去,那么会抛异常,注意,oracle中的exception块相当于java中的catch块,他不需要写try块
declare
  v_ename varchar2(5);   //相当于String ename;
  v_sal   number(7,2);
begin
  select ename ,sal into v_ename,v_sal from emp where empno=&no;
  dbms_output.put_line('雇员名:'||v_ename||'  工资'||v_sal);  
exception
when no_data_found then
dbms_output.put_line('朋友,你的编号输入有误');  
end;


4。块编程简单分类: 过程(存储过程),函数,触发器,包。也就是说这四种东西里面都有块


5。命名规范:
1。当定义变量时,建议用v_作为前缀v_sal
2.当定义常量,建议用c_做前缀c_rate
3.当定义游标时,建议用_cursot作为后缀,emp_cursor
4.当定义例外时,建议用e_作为前缀 e_error

6。如何调用
在数据库中可以这样调用: 
     exec sp_pro1(参数1,参数2)
或者
     call sp_pro1(参数1,参数2)
但是在java中调用存储过程只能用call.....

-------------------------存储过程----------------------------------------------------------
1.创建存储过程--存储过程中有块结构
create or replace procedure sp_pro1 is
 begin
  insert into mytest ('zwz','m1234');
 end;
 /   --斜杠的意思是执行

 但是出错了,我们通过show error可以查看错误信息
 
 SQL Statement ignored ,缺少select 关键字
 
 意思就是说我们这条sql少了些关键字,仔细观察,原来少了 values这个关键字
 
 改:create or replace procedure sp_pro1 is
 begin
  insert into mytest values('zwz','m1234');
 end;
 / 

2。// 注意,不应该指定类型大小 newSal number相当于 int newSal ,newSal number(3,2)相当于 Float f = new Float(); //分配空间了哈
create procedure sp_pro3(spName varchar2,newSal number) is
--下面就是按照块的规则写就是了
begin
  update emp set sal=newSal where ename=spName;
end;

--------------------输入与输出参数-------------------------------------------------
3。单个结果返回
//如果使用了out,那么就可以把它当做变量来使用,into到变量里面,在java中就可以拿到了
create or replace procedure sp_pro8
(spno in number,spName out varchar2) is
begin
 select ename into spName from emp where empno=spno; 
end;
在java中这样来拿值
CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");
cs.setInt(1,7788);//给第一个参数赋值
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
cs.execute();
String name = cs.getString(2); //得到第二个参数的返回值


4。多结果集 ---使用游标,其实就是ResultSet

----返回一个List,而不是单个数据
由于oracle存储过程没有返回值,他的所有返回值都是通过out参数来替代的,
列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用package了,所以要分成两部分

create or replace package test1 as 
type test_cursor is ref cursor;
end test1;  //创建了一个包test1,在包里面声明了一个游标类型 test_cursor

create or replace package sp_pro9
(spNo in number,p_cursor out test1.test_cursor) is
begin
   open p_cursor for select * from emp where deptno = spNo;
end;

--如何在java中调用游标
CallableStatement cs = ct.prepareCall("{call sp_pro9(?,?)}");
cs.setInt(1,10);
cs.registeroutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
cs.execute();

ResultSet rs = (ResultSet)cs.getObject(2); 


----------------------if/else--------------------------------------------------------
理论:

条件分支
if---then  对应  if(){}  其实then就相当于java中的{}
if---then--else 对应
 if(){
 }else{
 }
if---then--elsif---else  
对应 if(){
} else if(){
} else{}

1。if---then 例子

编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给改雇员工资增加10%
create or replace procedure pro_sp4(spName varchar2) is

v_sal emp.sal%type;  --%type是变量定义的一种方法,v_StudentID students.id%type意思是:变量v_StudentID与表students中id字段的数据类型一致
begin
select sal into v_sal from emp where ename=spName;
if v_sal <2000 then
 update emp set sal=sal+sal*1.1 where ename=spName;
end if;
end;

2。if---then--else例子
编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0
就把补助设为200
//create or replace procedure pro_sp4(spName in varchar2) is 这里比下面多了一个in,这个in是可以省略的,意思是可以输入
create or replace procedure pro_sp4(spName varchar2) is

v_comm emp.comm%type; 
begin
select comm into v_comm from emp where ename=spName;
if v_comm <> 0 then
 update emp set comm=comm+100 where ename=spName;
else
  update emp set comm=comm+200 where ename=spName;
end if;
end;

3。if---then--elsif---else例子

编写一个过程,可以输入一个雇员编号,如果该雇员的职位是president,就给他的工资增加1000,如果该雇员的职位是manager就给他的工资加500,其他雇员加200

create or replace procedure sp_pro6(spNo number) is
v_job emp.job%type;
begin

 select job into v_job from emp where empno=spNo;
 if v_job = 'president' then
   update emp set sal = sal+1000 where empno = spNo;
 elsif v_job='manager' then
   update emp set sal = sal+500 where empno = spNo;
 else
   update emp set sal = sal + 200 where empno = spNo;
 end if;
 
end;


-------------------case when--then end case-----------------------------------------------------------------
SQL> declare
  2   v_sal emp.sal%type;
  3   v_ename emp.ename%type;
  4  begin
  5    select ename,sal into v_ename,v_sal from emp
  6    where empno=&emp_no;
  7   case
  8      when v_sal<1000 then
  9       update emp
 10        set comm=100
 11       where ename=v_ename;
 12      when v_sal<2000 then
 13       update emp
 14        set comm=80
 15        where ename=v_ename;
 16      when v_sal<6000 then
 17        update emp
 18         set comm=50
 19        where ename=v_ename;
 20      end case;
 21  end;
 22  /
原值    6:   where empno=&emp_no;
新值    6:   where empno=7369;



------------------------循环----------------------------------------------------

理论:
循环:
for    ---for 

do{}       ---相当于loop---exit when
while();

while(){}  ---相当于 while ---loop

1。loop---exit when例子

编写一个过程,可以输入用户名,并循环添加10个用户到users表中,用户编号从1开始增加
create or replace procedure sp_pro7(spName varchar2) is
--定义
v_num number := 1;
--执行
begin
  loop
    insert into users values(v_num,spName);
    --判断循环是否退出
    exit when v_num=10;
    --自增
    v_num:=v_num+1;
  end loop;

end;

2。while ---loop例子

create or replace procedure sp_pro7(spName varchar2) is
--定义
v_num number := 1;
--执行
begin
  while v_num <=20 loop
     insert into users values(v_num,spName);
     v_num = v_num+1;
  end loop;

end;

3。for例子

--for的好处是不用定义变量,而且也是隐含的i++ ,相当于java中的增强for
begin 
  for i in reverse 1..10 loop
    insert into users values(i,'zwz');
  end loop;  
end;

SQL> declare result int;
  2  begin
  3    for i in 1..5 loop
  4      for j in 1..5 loop
  5        result:=i*j;
  6       exit when result=100;
  7       exit when result=50;
  8      end loop;
  9     dbms_output.put_line(result);
 10    end loop;
 11  end;
 12  /

--顺序控制语句---goto(不建议使用,破坏了封装,相当于汇编语言的特性),null
SQL> declare i int:=1;
  2  begin
  3    loop
  4      insert into temp values(i);
  5      if i=20 then  goto end_loop;  --这里goto 到end_loop标签下面
  6      end if;
  7      i:=i+1;
  8     end loop;
  9    <<end_loop>> ---直接跳到这个标签这里了
 10   dbms_output.put_line('循环结束');
 11  end;
 12  /



null语句只是为了提高程序的可读性
SQL> run
  1  declare
  2  v_sal emp.sal%type;
  3  v_ename emp.ename%type;
  4  begin
  5  select ename,sal into v_ename,v_sal from emp
  6   where empno=&emp_no;
  7   if v_sal<3000 then
  8    update emp
  9     set comm=sal*0.1
 10    where ename=v_ename;
 11  else
 12    null; --否则什么也不做
 13  end if;
 14* end;
if v_sal < 3000 then
.....;
else 
 null;   --其实这里的else null;完全可以不用
 end if;  

------------------------execption-------------------------------------------------------

SQL> set serveroutput on
SQL> declare
  2    emp_name emp.ename%type;
  3  begin
  4    select ename into emp_name from emp;
  5  EXCEPTION
  6    when too_many_rows then
  7     dbms_output.put_line('出错了,不允许返回多行!');
  8  end;
  9  /
when too_many_rows then  ---返回多行
when no_data_found then   ---数据不存在
 when value_error then   ----值不合法,比如我要一个int你给我一个varchar,我要5位,你给我7位 dbms_output.put_line('要存储在姓名中的值过长');


自定义异常
SQL>  declare
  2    sal_error  exception; ---申明异常
  3    emp_comm   emp.comm%type;
  4  begin
  5   select NVL(comm,0) into emp_comm from emp
  6    where empno=&emp_no;
  7   if emp_comm>1000 then
  8     raise sal_error;  ----抛出
  9   end if;
 10  EXCEPTION
 11    when sal_error then  ---接住
 12      dbms_output.put_line('奖金超出范围');
 13* end;

引发应用程序错误:
SQL> declare
  2     emp_no  emp.empno%type;
  3     emp_comm emp.comm%type;
  4     comm_exception  exception;
  5  begin
  6    emp_no:=7369;
  7    select nvl(comm,0) into emp_comm from emp
  8    where empno=emp_no;
  9   if emp_comm=0 then
 10     raise comm_exception;
 11   else
 12     dbms_output.put_line('奖金为:' || emp_comm );
 13   end if;
 14  EXCEPTION
 15    when comm_exception then
 16       raise_application_error(-20001,'未指定奖金的值'); --直接抛给java
 17  end;
 18  /
在oracle端的效果是
*
ERROR 位于第 1 行: 
ORA-20001: 未指定奖金的值
ORA-06512: 在line 16 


分享到:
评论

相关推荐

    11oracle的PL-SQL编程-块.过程 PPT

    11oracle的PL-SQL编程-块.过程 PPT 11oracle的PL-SQL编程-块.过程 PPT

    Oracle-PLSQL-编程语法详解-触发器.docx

    学习永无止境:触发器是许多关系数据库系统都提供的一项技术。在 ORACLE 系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块。

    Oracle PL-SQL编程详解.pdf

    本⽂⽬录: 1. PL/SQL 程序设计简介 2. PL/SQL块结构和组成元素 3. PL/SQL流程控制语句 4. 把游标说透 5. 异常错误处理 6. 把过程与函数说透 7. 程序包的创建与应⽤ 8. 把触发器说透

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton Kerry Osborne Robyn Sands Riyaj Shamsudeen Jared Still 译者: 朱...

    Oracle编程艺术

    第 1章 开发成功的Oracle应用程序...................................................... 61 1.1 我的方法................................................................................ 63 3 / 976 1.2 ...

    Oracle编程详解

    02. PLSQL 块结构和组成元素;03. PLSQL 流程控制语句;04. PLSQL 把游标说透;05. PLSQL 异常错误处理;06. PLSQL 把过程与函数说透;07. PLSQL 程序包的创建与应用;08. PLSQL 把触发器说透。 如果看完你绝对精通...

    Oracle_PLSQL_编程语法详解

    第二章 PL/SQL块结构和组成元素 第三章 PL/SQL流程控制语句 第四章 游标的使用 第五章 异常错误处理 第六章 存储过程和函数 第七章 包的创建和应用 第八章 触发器 第九章 ORACLE提供的常用包

    精通Oracle.10g.PLSQL编程

    本书是专门为Oracle应用开发人员提供的编程指南。通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和...

    oracle9i oracle11g oracle10g 性能调优 基础学习 视频地址

    1z0-033-13 关于自动段空间管理 ext 与oracle 空间使用 percent oracle块参数 行迁移问题 什么时间进行索引重组 优化性能 13 1z0-033-15 讨论不同类型索引 索引组织表(簇化表) OLTP 有什么性质要求 13 1z0-033-18-...

    Oracle 入门文档2

    Oracle 入门文档 Oracle笔记 一、oracle的安装、sqlplus的使用 ...Oracle笔记 十二、PL/SQL 面向对象oop编程 Oracle笔记 十三、PL/SQL面向对象之package Oracle笔记 十四、查询XML操作、操作系统文件

    「Oracle存储过程及块编程基础经典案例」.docx

    「Oracle存储过程及块编程基础经典案例」.docx

    Oracle 入门文档

    Oracle 入门文档 Oracle笔记 一、oracle的安装、sqlplus的使用 ...Oracle笔记 十二、PL/SQL 面向对象oop编程 Oracle笔记 十三、PL/SQL面向对象之package Oracle笔记 十四、查询XML操作、操作系统文件

    精通Oracle 10g SQL和PL/SQL

     本书是专门为oracle开发人员而提供的编程指南 通过学习本书 读者不仅可以掌握编写sql语句和pl/sql块的基础知识 而且还可以掌握sql高级特征 正则表达式 flashback查询 merge语句 sql:1999连接 和pl/sql高级特征 ...

    oracle实验报告

    实验3 Oracle数据库开发环境下PL/SQL编程 【实验目的】 (1)掌握 PL/SQL 的基本使用方法。 (2)在SQL*PLUS环境下运行PL/SQL的简单程序。 (3)应用 PL/SQL 解决实际问题 【实验内容与步骤】 PL/SQL块中的可执行部分...

    Oracle Database 11g初学者指南--详细书签版

    7.1.10 数据文件、表空间、段、分区和块 182 7.1.11 转储文件 183 7.2 Oracle用户管理的备份和恢复 183 7.2.1 用户管理的备份类型 184 7.2.2 冷备份 184 7.2.3 热备份 184 7.2.4 从冷备份中恢复 185 7.2.5 ...

    plsql_oracle 编程

    §5.3 异常错误处理编程 13 §5.4 在 PL/SQL 中使用 SQLCODE, SQLERRM 13 第六章 存储函数和过程 13 §6.1 引言 13 §6.2 创建函数 13 §6.3 存储过程 13 §6.3.1 创建过程 13 §6.3.2 调用存储过程 13 §6.3.3 开发...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    组成:表空间、段、区、块的组成层次 六、 oracle安装、卸载和启动  硬件要求 物理内存:1GB 可用物理内存:50M 交换空间大小:3.25GB 硬盘空间:10GB  安装 1. 安装程序成功下载,将会得到如下2个文件: ...

    Oracle11g从入门到精通2

    第4章 Oracle PL/SQL语言及编程 4.1 PL/SQL简介 4.1.1 PL/SQL的基本结构 4.1.2 PUSQL注释 4.1.3 PL/SQL字符集 4.1.4 PL/SQL数据类型 4.1.5 PIJSQL变量和常量 4.1.6 PL/SQL语句控制结构 4.1.7 PL/...

Global site tag (gtag.js) - Google Analytics