查看: 17913|回复: 31

[精华] oracle开发 VS INFORMIX开发 实战总结

[复制链接]
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-4-23 21:11 | 显示全部楼层 |阅读模式
项目组做的外省业务中,其中北方有好几个省是用INFORMIX的,现将开发过程中我们项目组一年来的经验总结汇发出,给大家共享一下:)

变量定义
Oracle:  
    v_table_name USER_TABLES.table_name%TYPE;
Informix:
   define  v_table_name like systables.tabname;
   
   
判断某张表是否被锁住
Oracle:  
       select count(*) into v_count from v$locked_object
          where object_id  
                 in (select object_id from user_objects
                      where object_name=upper('fact_g_gprs_settle') );
Informix:
       select count(*) into v_count from sysmaster:syslocks
           where owner>0 and waiter>0
               and tabname=lower(‘fact_G_gprs_settle') );

to_char和to_date函数
Oracle:
     to_char(sysdate,'yyyymmdd')
     to_date(‘20080910’,’ yyyymmdd’)
Informix:
      to_char(today,’%Y%m%d‘) ;
      to_char(current,’%Y%m%d’);
      to_date(‘20080910’,%Y%m%d);

在日期中增加某个单元值
Oracle:
     增加1天:  sysdate +1
     增加一分钟:SYSDATE+1/24/60
Informix:
     增加1天:  today + 1 units day   (增加其他时间单元方法类似);
     增加1分钟:current + 1 units minute

判断是否是星期六
Oracle:
to_char(to_date(sampling_date,'yyyymmdd'),'fmday')='星期六'  
informix:
weekday(to_date(sampling_date,'yyyymmdd'))=6

DUAL
Oracle:
   select to_char(sysdate - i, 'yyyymmdd') into v_date from dual;
Informix:
   let v_date = to_char(today – i units day,’%Y%m%d’)    不需要和数据库交互;
    或者
    select to_char(today – i units day, ‘%Y%m%d') into v_date from dual;
    其中dual是sysmaster:sysdual的同义词,已经在zhjs_app中创建。
    其中:i是整形变量

others  exception 的转换
Oracle:
   exception  when others then
        o_returncode := -1;
        o_returnmsg  := substr('[01]' || 'p_bi_control_call_code错误告警 ' ||sqlerrm,1,255);
   rollback;
   
Informix:
   define sql_err int;
   define isqm_err int;
   define err_info varchar(255)
   on exception set sql_err,isam_err,err_info
      -- informix依次把sqlcode,isam code和错误信息传递给上述3个变量;
        let o_return_code=-1
        let = substr('[01]' || 'p_bi_control_call_code错误告警 ' ||err_info,1,255);
        rollback;
        return o_returncode,o_returnmsg;
   end exception;

人工触发exception
Oracle:
   e_error exception;    /* exception是一个变量*/
   if v_flag not in('a','b') then
      raise e_error;
   end if;
   exception
   when e_error then
     rollback;
     vo_errmsg := '[p_expdb_acc_d_sms]error:'||vo_errmsg;vo_return := '1161';
Informix:
  on exception in (30000)
       rollback;
       let vo_errmsg = '[p_expdb_acc_d_sms]error:'||vo_errmsg;
       let vo_return = '1161';
       return vo_errrms,vo_return
  end exception;
  if v_flag not in('a','b') then
     raise exception 30000;
  end if;
  注意: 1)exception的错误号必须是一个smallint的数字;
              2)informix通过return语句获得返回值;而oracle通过头文件的声明来获得;
              3) 无论是informix还是oracle在触发exception之后,缺省的情况下程序都退出过         程;

Oracle NO_DATA_FOUND  exception
Oracle:
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    o_returncode := 1;
    o_returnmsg  := SUBSTR('[01]' || '没有' || v_date || '数据 ' || SQLERRM,  1, 255);
    ROLLBACK;
Informix:
  在select … into/ insert into <tabname) select <column_list>之后,
  通过dbinfo函数来判断如果查询到的记录行数为0,则人工触发exception
   if dbinfo(‘sqlca.sqlerrd2’)= 0  then
      raise exception 100;
   end if;

Oracle中捕捉记录重复的exception
e_unique        EXCEPTION;
WHEN e_unique  THEN
        RAISE DUP_VAL_ON_INDEX;
     END;
WHEN DUP_VAL_ON_INDEX  THEN
            ROLLBACK;
            v_errmsg := SUBSTR('规则:'||v_val_name||'已存在!',
                        1,
                        500);
            v_errcode := 1161;
            
Informix中捕捉记录重复的exception
on EXCEPTION in (-268)  --重复记录,-268是插入重复记录的出错号
   ROLLBACK;
   let v_errmsg = SUBSTR('规则:'||v_val_name||'已存在!', 1,500);
            let v_errcode = 1161;
            return v_errcode;
end exception;

exception的嵌套处理
oracle:
    o_returncode=:1;
    begin
             if (substr(i_dealdate,7,2)='21') then
                    v_sql:='insert  into jtfx_to_tsp_callnumber_bak(tsp_code,area_code,brand_code)
                            select   tsp_code,area_code,brand_code
                            from jtfx_to_tsp_callnumber t' ;
                    execute immediate v_sql;
                    commit;
              end if;
         exception when NO_DATA_FOUND
             o_returncode := 1;
             rollback;
        end ;
o_returncode:=0;   --将继续执行这条语句
Oracle在begin/end块之间如果触发了NO_DATA_FOUND的意外,有两种处理情况:
1.如果在本块内定义了NO_DATA_FOUND的意外处理程序,将继续执行end之后的语句;
2.如果在本块内没有定义NO_DATA_FOUND的意外处理程序,将执行程序末尾的exception处理程序,主过程返回。

informix
由于exception必须定义在begin之后,因此需要按下面的方式处理:
let v_returncode=1;
begin
    on exception in (100)
          let i=i;
    end exception;
             if (substr(i_dealdate,7,2)='01') then
                let v_sql='insert into bi_to_tsp_callnumber_bak(tsp_code,area_code,brand_code,ca
ll_code,call_head,first_date,last_date)
                 select  tsp_code,area_code,brand_code,call_code,call_head,first_date,last_date
                            from bi_to_tsp_callnumber t' ;
                      execute immediate v_sql;
                    if dbinfo("sqlca.sqlerrd2")=0 then
                        raise exception 100;
                    end if;
                    
              end if;
        end ;
let v_returncode=0; --将继续执行这条语句

Oracle的partitoin定义
create table TRW_REPORT_CTJS
(
  DAY_ID                 NUMBER(2) not null,
  PROV_CODE                NUMBER default 0 not null  )
partition by range (DAY_ID)
(
  partition P_01 values less than (2)
    tablespace ZHJS_STAT
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
  partition P_02 values less than (3)
    tablespace ZHJS_STAT
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      minextents 1
      maxextents unlimited
    ),
   
Oracle指定到特定的partition上读取数据
v_sql:= ' insert into tmp_qh_voice_hlht_yyfx_rep3 '||
            ' select substr(t.start_datetime,1,6)'||
            ' from tl_y_voice_list_'||vi_month||' partition(p_'||vi||') t '||
            ' where t.called_brand_code in (41,51,55,82,83,84,85,89) ';
   execute immediate (v_sql);
   
informix按日期分片   
   create table <tablename>
(  …
day_id int
) fragment by expression
parttion part1 day_id =1 in  datadbs,
parttion part2 day_id =2 in datadbs,
parttion part3 day_id =3 in datadbs ,
….
parttion part31 day_id=31  in datadbs;
--也可以指定放在同一个dbspace上

informix指定到特定的partition上读取数据
v_sql:= ' insert into tmp_qh_voice_hlht_yyfx_rep3 '||
            ' select substr(t.start_datetime,1,6)'||
            ' from tl_y_voice_list_'||vi_month||' where day_id=v_day_id')  '||
            ' where t.called_brand_code in (41,51,55,82,83,84,85,89) ';
   execute immediate (v_sql);
informix是通过跳过片的方式来实现

merge
oracle
merge INTO TRUNK_ERROR D
  USING (SELECT * FROM TMP_TRUNK_ERROR) S
  ON( S.source_id  = D.source_id  AND
         S.trunk_code = D.trunk_code AND
         S.trunk_side = D.trunk_side)
  WHEN matched THEN UPDATE SET D.num_cdrs = D.num_cdrs + S.num_cdrs
  WHEN NOT matched THEN
     INSERT(D.source_id,D.trunk_code,D.trunk_side,D.num_cdrs,D.STAT_FLAG)   
     VALUES(S.source_id,S.trunk_code,S.trunk_side,S.num_cdrs,'0' );
     
Informix
通过cursor来实现merge的功能
在TMP_TRUNK_ERROR上定义cursor
对fetch出的每一行记录按条件判断在TRUNK_ERROR 是否存在相同的记录
如果存在,则将trunk_error中的相应记录值修改为tmp_trunk_error中的值或
    进行其他的处理;
    如果不存在,则将此记录插入到trunk_error表中

truncate
Oracle:
EXECUTE IMMEDIATE 'truncate table JTFX_TMP_TSP_CALLNUMBER';
Informix :
truncate table JTFX_TMP_TSP_CALLNUMBER;

执行动态SQL     
Oracle :

具有下面的语法:
1.exceute immediate sqlcmd into :var1,:var2 ;
2.execute immediate sqlcmd using  :var1,:var2;
Informix:
目前在过程中没有into和using的选项;
需要通过游标来实现;
需要将var1和var2以及sqlcmd连接为一个字符串,
然后在通过execute immediate来执行

cursor -oracle
cursor c_cur2(v_task_id number) is
  select format_id,format_item,format_item_val,deal_date
    from tg_stat_result_temporarily
  where task_id=v_task_id;
for v_cur2 in c_cur2(v_cur1.task_id)
loop select wg_model_code,wg_log_code,wg_recycle_code,
                   wg_record_code
           into v_wg_model_code,v_wg_log_code,v_wg_recycle_code,
                  v_wg_record_code
          from zhjs_param_tj.tg_format_item
        where format_id=v_cur2.format_id and    format_item=v_cur2.format_item;
cursor -informix        
foreach
  select format_id,format_item,format_item_val,deal_date
      into v_format_id, v_format_item,v_format_item_val,v_deal_date
     from tg_stat_result_temporarily where   task_id=v_task_id
end foreach;
rownum -oracle
Oracle:
select sum(a.monitor_val) into v_total_value
  from (select monitor_val from flux_monitor_result
           where area_code=v_area and source_id=v_source
              and account_item=v_account
              and to_char(to_date(sampling_date,'yyyymmdd'),'fmday')
                     ='星期六' and check_flag=1
     order by sampling_date desc) a
   where rownum <= v_count;
  
rownum -informix   
Informix:
select  sum(a.monitor_val) into v_total_value
  from (select first v_count-1 monitor_val
              from flux_monitor_result
           where area_code=v_area and source_id=v_source
               and account_item=v_account
               and weekday(to_date(sampling_date,' %Y%m%d '))=6
               and check_flag=1
            order by sampling_date desc);
            
标号语句            
Oracle:
Loop
  if  v_expression1 is null then
       goto next2;
  end if
  <<next2>>
  null;
end loop;   
informix:
loop
    if  v_expression1 is null then
        contiune;
    end if;
  end loop;
informix的continue/exit语句在loop/while/for/foreach中都可以使用

Oracle CONNECT BY语句
将具有层次关系的表展示为树形结构:
select a.tnode tnode,a.tprior_node tprior_node,sys_connect_by_path(tname,'*') by_path
      from tp_relation a
      start with a.tprior_node is null
connect by prior a.tnode = a.tprior_node;
connect by为关联条件;
start with为树形结构的进入点;
Informix CONNECT BY实现方法
start with为树形结构的进入点;
         
   
Informix CONNECT BY实现方法
通过底层递归调用存储过程,完成层次关联处理
提供封装的存储过程实现CONNECT BY功能
定义异常的顺序需要注意!(informix)
对OTHERS的定义必须位于其他异常定义的最后面,要不然会出现异常代码没有定义的错误信息
另外,对于返回的varchar型的变量,在返回时一定要赋值,否则会出错

[ 本帖最后由 wabjtam123 于 2010-4-23 21:49 编辑 ]
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2010-4-23 21:15 | 显示全部楼层
nice,这东西没用过
有db2的比较就好了

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-4-23 21:18 | 显示全部楼层

回复 #2 〇〇 的帖子

现在电信行业INFORMIX的使用有上升趋势啊,特别是北方电信

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2010-4-23 21:26 | 显示全部楼层
good!没有用过!

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2010-4-23 22:21 | 显示全部楼层
INFORMIX还没死?

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-4-23 22:32 | 显示全部楼层
呵呵,NEWKID兄,死不了,很有活力啊,现在北方电信主推INFORMIX啊

[ 本帖最后由 wabjtam123 于 2010-4-23 22:34 编辑 ]

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2010-4-23 22:45 | 显示全部楼层
说明他们的市场队伍比技术队伍强很多。

使用道具 举报

回复
论坛徽章:
28
授权会员
日期:2009-01-04 22:12:21世界杯纪念徽章
日期:2014-07-14 11:31:462014年世界杯参赛球队: 澳大利亚
日期:2014-06-25 11:06:552014年新春福章
日期:2014-02-18 16:42:02ITPUB社区12周年站庆徽章
日期:2013-10-08 14:55:07NBA季后赛纪念徽章
日期:2013-06-21 14:52:05NBA常规赛纪念章
日期:2013-04-22 11:49:35季节之章:冬
日期:2012-11-15 16:55:18ITPUB元老
日期:2011-03-17 09:38:472014年世界杯参赛球队: 俄罗斯
日期:2014-07-17 17:21:42
发表于 2010-4-24 01:07 | 显示全部楼层
顶~移动很多省都在用informix

俩人之间来回转也挺费时间的~

使用道具 举报

回复
认证徽章
论坛徽章:
50
2014年世界杯参赛球队: 荷兰
日期:2014-07-11 07:56:59蛋疼蛋
日期:2012-03-06 07:22:542012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-01-04 11:53:29蛋疼蛋
日期:2011-11-11 15:47:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
发表于 2010-4-24 07:42 | 显示全部楼层
呵呵,其实电信也不是太喜欢ORACLE一家独大,还是希望引入竞争,所以总部还是有此政策倾斜

使用道具 举报

回复
认证徽章
论坛徽章:
9607
土豪章
日期:2013-12-31 14:11:39土豪章
日期:2013-12-31 14:11:39阿森纳
日期:2013-06-03 17:00:31阿森纳
日期:2013-10-11 09:27:58法拉利
日期:2013-12-27 15:20:30林肯
日期:2013-12-27 15:19:09法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30法拉利
日期:2013-12-27 15:20:30
发表于 2010-4-24 16:58 | 显示全部楼层
学习,good

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表