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

来源:互联网 发布:手机淘宝 手机天猫 编辑:程序博客网 时间:2024/06/09 17:11

 游标

 

--定义一个游标

declarecursor cur_sel

isselectename,salfrom 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.nextvalinto :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(moneint,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 ptempint:=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(pnvarchar2) returnnvarchar2;

functionput_line(pnvarchar2,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;

 

包头与包体必须连续创建

 

原创粉丝点击