【oracle资料整理】--【13】PL/SQL块

PL/SQL块

declare

  begin
   --SQL语句
   --直接写的SQL语句(DML/TCL)
   --间接写execute immediate <DDL/DCL命令字符串>
   --select 语句
        <1>必须带有into子句
         select empno into eno from emp
           where empno =7369;
        <2>只能查到一行**********
        <3>字段个数必须和变量的个数一致
  exception
    --异常
    when <异常名字> then --特定异常
        <处理语句>
    when others then  --所有异常都可捕获
        <处理语句>  
  end;

<例子>
   编写程序 向DEPT表中插入一条记录,
   从键盘输入数据,如果
      数据类型输入错误要有提示
      无法插入记录 也要有提示
      只能输入正数,如果有负数提示
   declare
    n number;
    no dept.deptno%type;
    nm dept.dname%type;
    lc dept.loc%type;
    exp exception;   --异常的变量
    exp1 exception;
    num number:=0;  --计数器
    pragma exception_init(exp,-1); --预定义语句
         --(-1错误和异常变量关联)
    pragma exception_init(exp1,-1476);
    e1 exception; --自定义异常变量
   begin
    --输入值
     no := '&编号';
     num := num + 1;
     if no < 0 then
        raise e1;    --自定义异常的引发
     end if;

     nm := '&名称';
     num := num +1;

     lc := '&地址'; 
     num := num +1;

     n := 10 /0;    

     insert into dept values (no,nm,lc);
     num := num +1;
     commit;

   exception
     --自定义异常
     when e1 then
        dbms_output.put_line('编号不能为负数');
     --数据类型不对
     when value_error then
        if num =0 then 
         dbms_output.put_line('编号数据类型不对');
        elsif num = 1 then
         dbms_output.put_line('名称数据类型不对');
        elsif num =2 then
         dbms_output.put_line('地址数据类型不对');
        end if;
        rollback;
     --主键冲突
     when exp then
         --sqlcode全局变量 异常错误号
         --sqlerrm全局变量 异常的文字信息 
         --dbms_output.put_line('异常的编号:'||sqlcode);
         --dbms_output.put_line('异常的内容:'||sqlerrm);
         --dbms_output.put_line('编号已存在') ;
         rollback;
     --非预定义异常(关联错误号)
     when exp1 then
         --dbms_output.put_line('0做了除数') ;
         raise_application_error(-20001,'0做了除数'); --引起一个自定义的错误
         --预先保留-20001 到 -29999编号
         rollback;
     --其他的异常
     when others then
         dbms_output.put_line('异常的编号:'||sqlcode);
         dbms_output.put_line('异常的内容:'||sqlerrm);
        -- dbms_output.put_line('出现错误');
         rollback;
   end; 

--    insert into dept values (40,'asdf','asdf');
<简单的做法>
  --存放异常的
   create table save_exp(
      bh number,
      wz varchar2(1000)
   );

   declare
    no dept.deptno%type;
    nm dept.dname%type;
    lc dept.loc%type;
    errno number;
    errtext varchar2(1000);
   begin
     no := '&编号';
     nm := '&名称';
     lc := '&地址';
 
     insert into dept values (no,nm,lc);
     commit;
   exception
    when others then
      rollback;
      errno := sqlcode;
      errtext := sqlerrm;      
      insert into save_exp values (errno,errtext);
      commit;
   end; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值