CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

两个Oracle存储过程程序分享

作者: zhaolinjnu,  出处:IT专家网, 责任编辑: 李书琴, 
2008-04-21 08:30
  本文给出了两个存储过程程序。第一个存储过程,属性串替换函数,常用于数据订正过程中;第二个存储过程,检查相关属性对在目标属性串是否存在,常用于select查询语句。

  为了解决日常工作中的问题,再加上好久没有写程序,利用这个周末的时间写了如下的存储过程或函数,公布于此处,希望能对大家写这一类的程序有所启发。大家对写程序可能有一个误区,有些人常说:你看我什么语言都会,比如说C,C++,VB,perl,shell,其实语言的本身并不重要,重要的还是在算法上,置于语法,用时去查一下就可以了。

  第一个存储过程,属性串替换函数,常用于数据订正过程中(使用oracle提供的replace函数会有问题)

create or replace function sp_replace_property_value(v_ch varchar2,v_from varchar2,v_to varchar2) return varchar2
/*
creator:danchen
create_time:2008-4-19
function:replace taobao' property name and property value id as group
v_ch 属性串;v_from 源属性; v_to 目标属性,目标属性可为空,则变成删除属性
*/
as
--定义返回的返回的属性字符串
result_v varchar2(200):='';
--定义剩余属性字符串变量
temp_v varchar2(200):='';
--定义分号位置
fenhao_address number;
--定义临时属性对变量
v_pv varchar2(20);


begin
    if v_ch is null or v_from is null then
        return 'error';
    end if;
   
     if instr(v_ch,':') = 0 or instr(v_from,':')= 0 then
         return 'error';
     end if;
   
    temp_v := v_ch;
     loop
         fenhao_address := instr(temp_v,';');
         if fenhao_address=0 then
              --没有找到分号,则为最后一组属性名:属性值
              v_pv := temp_v;
              --检查属性是否是要替换的属性
              if v_pv != v_from then
                     result_v := result_v||';'||v_pv ;
              else
                    if v_to is not null then
                       result_v := result_v||';'||v_to;
                    end if;
              end if;
              --跳出循环
              exit;
          else
             --取出属性对
             v_pv := substr(temp_v,1,instr(temp_v,';')-1);
              --检查属性是否是要替换的属性
              if v_pv != v_from then
                  result_v := result_v||';'||v_pv ;
              else
                 if v_to is not null then
                       result_v := result_v||';'||v_to;
                 end if;
              end if;
             --得到剩余的属性对
             temp_v := substr(temp_v,instr(temp_v,';')+1);
          end if;        
     end loop;
    
     --对结果进行处理,去掉最左侧的分号
     if substr(result_v,1,1)=';' then
          result_v := substr(result_v,2);
     end if;
     --返回结果
     return result_v;
end sp_replace_property_value;

  第一个存储过程使用示例:

  SQL> select sp_replace_property_value('33392:118167;33393:107054;33391:118167','33393:107054','') from dual;

  SP_REPLACE_PROPERTY_VALUE('33392:118167;33393:107054;33391:118167','33393:107054

  --------------------------------------------------------------------------------

  33392:118167;33391:118167

  SQL> select sp_replace_property_value('33392:118167;33393:107054;33391:118167','33393:107054','33393:100') from dual;

  SP_REPLACE_PROPERTY_VALUE('33392:118167;33393:107054;33391:118167','33393:107054

  --------------------------------------------------------------------------------

  33392:118167;33393:100;33391:118167

共2页。 1 2 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i