游标,循环,触发器....

 游标

 

--定义一个游标

declarecursor cur_sel

isselectename,sal from scott.emp; --给游标关联数据源

 

v_ename nvarchar2(64);

v_sal int ;

begin

  open cur_sel;--打开游标(真正去执行关联的sql语句)

 

       loop

         --读取一行游标,往下读一行

         fetch cur_sel intov_ename,v_sal;

        dbms_output.put_line(v_ename||':'||v_sal);

       exitwhen cur_sel%notfound;

       endloop;

      

  close cur_sel;--关闭游标

  end;

 

 

 

 循环语句

Loop

Exit when 条件

End loop

While 条件

Loop

End loop

 

For in 1..2

Loop

End loop;

 

索引

createindex index_lma_lmname on lma(lmname);

 

createindex 索引名 on 表名(字段名)

 

 

 

 触发器

在进行操作之前运行:before

在进行操作之后运行:after

 

使用

foreachrow old new 才可以使用

删除::old.字段名

添加: :new.字段名

更新::old.字段名,:new.字段名

 

ü 删除触发器:droptrigger 索引名

 

 

ü 错误状态: raise_application_error(-20001,’提示’)

 

 

 

 

  触发器写法:

createorreplacetrigger tri_table

beforeinsertordeleteorupdateon scott.emp

foreachrow

begin

     case

       when inserting then

         dbms_output.put_line('这是添加'||:new.ENAME);

       when deleting then

         dbms_output.put_line('只是删除'||:old.ENAME);

       when updating then

        dbms_output.put_line(:old.ENAME||:old.ENAME);

        endcase;

end;

 

自增id的写法

createorreplacetrigger tri_table_lll

beforeinsertordeleteorupdateon lll

foreachrow

begin

     case

       when inserting then

           select id_identity.nextval into :new.id from dual;

       when deleting then

         dbms_output.put_line('只是删除'||:old.ENAME);

       when updating then

         dbms_output.put_line(''||:old.ENAME||:old.ENAME);

        endcase;

end;

l  调用自增:

insert into lll(ename,sal) values('lmy',45);要指明添加的字段

 

事物的四大特性

原子性,一致性,隔离性,持久性

 

保存点(commit执行前的定点回滚)

Savepoint 保存点名

Rollback to 保存点名

 

事物事例:银行转账模拟

createorreplaceprocedure proc_zz(mone int,zname nvarchar2,xname nvarchar2)

is

pemp int:=0;

begin

     --转出账号

     update scott.emp set sal=sal-mone where ename=zname;

     pemp:= pemp+sql%rowcount;

    

     --转入账号

     update scott.emp set sal=sal+mone where ename=xname;

     pemp:=pemp+sql%rowcount;

    

    --pemp:=pemp/10;

    

     if pemp <2then

       dbms_output.put_line('转账失败!');

       rollback;

       else

         dbms_output.put_line('转账成功!');

         commit;

      endif;

     

      exception

         whenothersthen

              begin

                   dbms_output.put_line('转账过程中出现问题!');

                   rollback;

              end;

end;

 

 调用存储

begin

  proc_zz(1000,'SCOTT','KING');

end;

 

 

自定义报错

 

--自定义异常

  declare ptemp int:=0;

  exp1 exception;

  exp2 exception;

  begin

  if ptemp=0then

    raise exp1;

   else

     raise exp2;

    endif;  

  exception

    when exp1 then

      dbms_output.put_line('出现了不可预计的错误哦...');

     when exp2 then

       dbms_output.put_line('出现了,传说中的报错了哦...');

     whenothersthen

       begin

           dbms_output.put_line('出现了一个小小的错误哦...');

         end;

     

 

  end;

 

Ø 表的备份(导入与导出):必须将导出的表放在oracle bin文件夹下面

u 导出

exp userid=cz/123456@orcl tables=(emp)file=E:\A.DMP

 

exp userid=登陆用户名/密码@orcltables=(表名(多张表用逗号隔开)) file=E:\名.DMP

 

导入

Imp userid=cz/123456@orclfile=E:\A.DMP

 

Imp userid=登陆用户名/密码@orclfile=E:\名.DMP

 

 

表未被删除导入时需要接: ignore=y

 


 包头:不是具体的实现

 

 

createorreplacepackage dmbs_outputm

is

functionput_line(p nvarchar2) returnnvarchar2;

functionput_line(p nvarchar2,p2 nvarchar2) return  nvarchar2;

end dmbs_outputm;

包体

 

createorreplacepackagebody dmbs_outputget

is

    function put_line(p nvarchar2)

    returnnvarchar2

     is

     begin

            return p;

       end;

  

      function put_line(p nvarchar2,p2 nvarchar2)

      return nvarchar2

      is

      begin  

        return p||p2;

     end;

 

end dmbs_outputget;

 

包头与包体必须连续创建

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值