日期:2014-05-16 浏览次数:20555 次
没说完,接着来。
一.过程的实现
2010年最后一个多月基本在捣腾总部报表那块,改动起来挺让人不舒服的。具体表现为报表中全部使用的是视图,另外业务关系没有相关的文档,而且很多视图有问题,甚至有些表已经基本面目全非,或者压根就没有了,所以实在比较闹心。但是总体来说,也就那么回事,改呗!正是利用这段时间,好好地把数据库编程给落实了,并且基本能拿oracle编程实现的东西就能oracle编程实现,还是有些收获的。
过程在游标那块已经有所接触了,那么这里看个静态执行sql语句的过程:
 ?create or replace procedure updateRe_SQL(id sys_report_file.fi_id%type) is
 i int;
  time1 varchar2(10);
  time2 varchar2(10);
  fl_id varchar2(4);
   s varchar2(4);
begin
  i:=0;
  time1:=dbms_utility.get_time;
  for i in 1..500 loop
      select t.fi_id into fl_id from sys_report_file t where t.fi_id=id;
      dbms_output.put_line('执行成功'||i||'条,id='||fl_id);
      s:=i;
   end loop;
  time2:=dbms_utility.get_time;
  dbms_output.put_line('时间差:'||round((time2-time1)/100,2));
  exception
 when no_data_found then 
      dbms_output.put_line('没有数据,中断:'||i);
      s:=s+2;
      dbms_output.put_line('没有数据,中断:'||s);
      updateRe_SQL;
  when others then
      dbms_output.put_line('其它错误中断:'||i);
end updateRe_SQL;
?
很简单的东东,这里也不做详解。为了程序的健壮性,建议写上异常处理。
二.函数的实现
函数,哎!到处都是函数,Java有函数,Javascript也有函数,只要是编程语言,基本都有函数这一说。废话不多说,讲下我使用过的函数呗。
 ?-- Created on 2010/12/20 by LW 
create or replace function exception_sele(num in number) return varchar2 is
  fl_id varchar2(20);
  i     int;
begin
  i := num;
  select t.FILENAME into fl_id from ktsys.sys_report_file t where t.fi_id = i;
  return fl_id;
exception
  when no_data_found then
    return '没数据';
  when others then
    return '有问题';
end;
?
同样建议写异常处理。函数需要注意的是返回值的大小,如果返回值过小很有可能出现一些问题。也不是什么难的东东。
三.触发器的实现
触发器在项目组使用比较多,至少在某些表数据的操作时,使用了触发器。记得宿舍一哥们问他们项目需要使用按时间点进行数据操作,问有什么方式。这个它采用java编程进行实现,我觉得完全用触发器进行实现完全可能。只要数据库服务开着,某事件的触发将引起相应触发器执行,这样也便于维护。网上到时间点进行操作的触发器很多,这里没必要进行述说。另外我们做的系统中,对于触发器使用了Freemarker模板引擎,这里涉及到一些知识点,这里也不详说。举个自己写的简单触发器例子吧。
Before操作:
 ?create or replace trigger ins
  before insert or update or delete on sys_report_file  
begin
  if to_char(sysdate,'DY') in ('星期三','星期四') then
     case when inserting then
           raise_application_error(-20001,'fail to insert');
         when updating then
               raise_application_error(-20001,'fail to update');
         when deleting then
              raise_application_error(-20001,'fail to delete');
     end case;
   end if;   
end ins;
?