`
liuwei8728
  • 浏览: 32442 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

2010 Oracle回顾(续)

阅读更多

没说完,接着来。

一.过程的实现

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;

 

 

    After操作:

Create or replace trigger tr_audit_emp

After insert or update or delete on ktsys.sys_report_file

Declare

  v_temp int;

Begin

  Select count(*) into v_temp from ktsys.sys_report_file;

  If v_temp = 0 then

raise_application_error(-20001,'fail to insert');

  End if;

  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 tr_audit_emp;

 

 

四.OracleJava的接触

总算要结束了,也快好几千个字,说明oracle数据库这块还是知道点东西了,明年一定要在质上有提高,到时就不是提高数据库编程能力,而应该将oracle的内部机制进行提高。

Oracle能够写java代码吗?可能没试过吧,答案是肯定的,只是一般不用,但是有时候遇到一些数据处理,用oracle费劲的话,倒是可以考虑用这东东整一下。不说废话,只说具体操作。

1.  建立java代码

create or replace and compile java source named mysource as

import java.util.Date;

public class Hello{

 public static void main(String []args){

        System.out.println("Hello");

 }

 

public static Date getDate(String str){

        System.out.println("Hello"+str);

        return new java.util.Date();

 }

}

 

 

很明显,两个静态函数,这里说一下,这里写的java代码用静态的static,否则会有问题。

2.  建立函数

create or replace function rand(str in string) return varchar2

AS

language Java Name 'Hello.getDate(java.lang.String) return Date';

 

 

怎么调用,哥就不说了。小屁东西。

3.  建立过程

create or replace procedure TransMetaData(str in string) as

  --language java name 'Hello.main(java.lang.String[])';  --貌似只能一个,

  language java name 'Hello.getDate(java.lang.String)';

 

 

怎么调用,哥还是不说。

ok!基本该说的也说了。原来我肚子里存的数据库房门的知识就这么点,哎!继续武装自己。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics