`
oboaix
  • 浏览: 277992 次
社区版块
存档分类
最新评论

Oracle 10g数据库分隔符函数实现(原创)

阅读更多

    工作中有时碰到需要在数据库中进行类似Java中split(",")生成数组方法,
希望也在数据库应用开发中也有这样的方法,前段时间查了Oralce官方网站关于管道函数的用法
参照帮助手册自己也写了一个分隔符函数返回数据集的函数,记录并学习...

 (Oracle Database 10g Enterprise Edition Release 10.2.0.1.0)

 

--1
create or replace type split_type as table of varchar2(32676);
--2
create or replace function fn_split(in_var varchar2,in_del varchar2,in_flag varchar2)
 return split_type PIPELINED 
as
  temp_str varchar2(32767):=in_var;
  temp_delimiter  varchar2(20):=',';--默认为逗号
  temp_index number:=0;            --分隔符的索引位置             
  temp_flag varchar2(20):='0';--默认没有前、后面逗号内容
  temp_rec number:=0;         --记录最后一位是否存在分隔符号
  --通过管道分隔函数实现分组,以指定的分隔符进行划分数据
  --标识是否具有首尾分隔符号数据出现数值 
  --默认为不出现 0不出现 1都出现 2前面出现 3后面出现
  --created by zxb 2008-10-31
begin
     temp_delimiter:=in_del;
     temp_flag:=in_flag;
     if length(temp_delimiter)=0 or temp_delimiter is null then
        temp_delimiter:=',';
     end if;
     if length(in_flag)=0 or in_flag is null then
        temp_flag:='0';
     end if;
     if instr(temp_str,temp_delimiter,-1)=length(temp_str) then
         temp_rec:=1; 
     end if;
     if(temp_flag='0') or (temp_flag<>'1' and temp_flag<>'2' and temp_flag<>'3') then
          if instr(temp_str,temp_delimiter)=1 then
             temp_str:=substr(temp_str,2);
          end if;
          if temp_rec=1 then
             temp_str:=substr(temp_str,1,length(temp_str)-1);
          end if;
          while instr(temp_str,temp_delimiter)>=0 loop
           temp_index:=instr(temp_str,temp_delimiter);
           if(temp_index>0) then
               pipe row(substr(temp_str,1,temp_index-1));
               temp_str:=substr(temp_str,temp_index+1);
           else
               pipe row(temp_str);
                exit;--10g,  return;--9i
           end if;
         end loop;  
      else
          if temp_flag='1' then 
               while instr(temp_str,temp_delimiter)>=0 loop
                 temp_index:=instr(temp_str,temp_delimiter);
                 if(temp_index>0) then
                    pipe row(substr(temp_str,1,temp_index-1));
                    temp_str:=substr(temp_str,temp_index+1);
                 else
                    pipe row(temp_str);
                    exit;--10g,  return;--9i
                 end if;
               end loop;
               if temp_rec=1 then
                  pipe row('');
               end if;
           else
               if temp_flag='2' then 
                  while instr(temp_str,temp_delimiter)>=0 loop
                    temp_index:=instr(temp_str,temp_delimiter);
                    if(temp_index>0) then
                       pipe row(substr(temp_str,1,temp_index-1));
                       temp_str:=substr(temp_str,temp_index+1);
                    else
                       pipe row(temp_str);
                        exit;--10g,  return;--9i
                    end if;
                  end loop;
               else
                  if instr(temp_str,temp_delimiter)=1 then
                     temp_str:=substr(temp_str,2);
                  end if;
                  while instr(temp_str,temp_delimiter)>=0 loop
                     temp_index:=instr(temp_str,temp_delimiter);
                     if(temp_index>0) then
                        pipe row(substr(temp_str,1,temp_index-1));
                        temp_str:=substr(temp_str,temp_index+1);
                     else
                        pipe row(temp_str);
                         exit;--10g,  return;--9i
                     end if;
                  end loop;
                  if temp_rec=1 then
                     pipe row('');
                  end if;  
               end if;
           end if;
      end if;
      exception
       when others then
       pipe row('');
end;
--3简易方法
create or replace function split_del(in_var varchar2,in_del varchar2)  
 return split_type PIPELINED 
 as
  temp_str varchar2(32767):=in_var;
  temp_delimiter  varchar2(20):=',';--默认为逗号
  temp_index number:=0;  
 begin
      temp_delimiter:=in_del;
      if length(temp_delimiter)=0 or temp_delimiter is null then
        temp_delimiter:=',';
      end if;
      while instr(temp_str,temp_delimiter)>=0 loop
         temp_index:=instr(temp_str,temp_delimiter);
         if(temp_index>0) then
            pipe row(substr(temp_str,1,temp_index-1));
            temp_str:=substr(temp_str,temp_index+1);
         else
            pipe row(temp_str);
             exit;--10g,  return;--9i
         end if;
       end loop;
      exception
       when others then
       pipe row(''); 
 end;
--测试代码
SQL> select * from table (fn_split(',abc,123,---,***,+++,2ss,',',',0));
 
COLUMN_VALUE
--------------------------------------------------------------------------------
abc
123
---
***
+++
2ss
 
6 rows selected
 
SQL> select * from table (split_del(',abc,123,---,***,+++,2ss,',','));
 
COLUMN_VALUE
--------------------------------------------------------------------------------
abc
123
---
***
+++
2ss
 
7 rows selected
 
SQL> 

  

分享到:
评论

相关推荐

    Oracle函数:根据自定义分隔符拆分字段SPLIT-STR()然后查询检索数据库表数据

    4、易于集成:函数设计简洁,易于集成到现有的Oracle数据库系统中,无需复杂的配置和改造。 5、优化查询性能:通过避免复杂的子查询和嵌套循环,我们的函数显著提升了数据处理的速度,减少了数据库资源的消耗,让您...

    oracle数据库 110个常用函数

    15. TO_CHAR 函数:将数字转换为格式化的字符串,如TO_CHAR(9999.99) 可以控制小数点后的位数和千分位分隔符等。 这些函数在处理Oracle数据库中的数据时非常实用,无论是数据清洗、数据分析还是报告生成,都能大大...

    Oracle中实现Split函数功能

    Oracle 中实现 Split 函数功能的优点是可以灵活地处理不同的分隔符和字符串长度。同时,这个函数也可以与其他 Oracle 函数和操作符结合使用,以实现更加复杂的数据处理任务。 在实际应用中,Oracle 中实现 Split ...

    聚集函数(自定义分隔符拼接字符串)

    本文将深入探讨如何在PL/SQL中创建自定义聚集函数,以实现自定义分隔符的字符串拼接。 首先,让我们理解聚集函数的概念。聚集函数在SQL查询中用于处理一组值,而不是单个值。它们对一组行进行操作并返回单个结果。...

    oracle·10G函数大全

    Oracle 10g是一款历史悠久但仍然广泛使用的数据库管理系统,它提供了丰富的函数库,使得数据库管理和查询更为便捷高效。本文将深入探讨Oracle 10g中的关键函数,旨在为数据库管理员和开发人员提供全面的参考。 一、...

    oracle分隔字符串函数

    本文详细介绍了如何在 Oracle 数据库中实现字符串分隔的功能,通过自定义函数 `splitstr` 实现了根据用户定义的分隔符来分割字符串的目标。这种方法不仅灵活,而且易于维护和扩展,非常适合于处理各种复杂的字符串...

    oracle10g,9i多行合并一行函数

    ### Oracle 10g与9i中的多行合并为一行函数详解 在Oracle数据库系统中,经常需要将多个行的数据合并成单行显示,尤其是在处理报告或者需要将多个值组合成一个字符串的情况下。本文将详细介绍如何在Oracle 10g与9i...

    oracle数据库自定义split函数和调用具体实现

    在Oracle数据库中,有时我们需要对字符串进行拆分处理,以便于处理包含多个元素的数据。例如,在给定的场景中,有一个名为`JOB_NUMBER`的字段,它存储的是多个工号,以特定的分隔符(如斜杠"/")分隔。需求是创建一...

    oracle_split_函数_返回数组

    在Oracle数据库中,由于内置函数不直接支持像Java中的`split`那样拆分字符串并返回数组,因此开发者需要自定义函数来实现这一功能。这里提到的两种方法都是为了解决这个问题,即根据指定的分隔符将字符串拆分为一个...

    oracle常用字符函数

    Oracle数据库中的字符函数是SQL和PL/SQL编程中不可或缺的一部分,它们主要用于处理和操作文本数据。以下是对给定文件中提到的一些主要字符函数的详细解释: 1. ASCII(n) 函数: - 该函数返回字符串的第一个字符的...

    Oracle拆分字符串,字符串分割的函数

    在Oracle数据库中,处理字符串是常见的操作之一,尤其是在数据分析或数据清洗的过程中。有时我们需要将一个长字符串分割成多个部分,以便进行进一步的操作。Oracle提供了一些内置的函数来帮助我们完成这个任务。本篇...

    Oracle数据库中单行字符串函数简介

    Oracle数据库中的单行字符串函数是处理和操作字符串数据的...了解并熟练掌握这些单行字符串函数对于在Oracle数据库中进行数据操作和查询至关重要,它们可以帮助开发者高效地处理字符串数据,实现复杂的文本处理需求。

    Oracle内置函数大全

    例如,`999G999`会根据`NLS_NUMERIC_CHARACTER`参数设定的分隔符来分隔数字,`9.99D9`会定位小数点,`$$999 999.99`会在数字前放置美元符号。此外,还有`PR`用于格式化负数,`R`用于罗马数字,`S`将符号放在数值后,...

    精通oracle 10g plsql 编程-学习笔记

    - **PL/SQL词汇单元分隔符**: 如`;`用于分隔语句。 - **标识符**: 用于命名变量、函数等。 - **文本**: 包括数字文本、字符文本、字符串文本等。 - **注释**: 单行注释`--`或多行注释`/* */`。 - **PL/SQL代码编码...

    历史上最全的oracle内置函数大全

    这些内置函数是Oracle数据库处理数据时的重要工具,它们可以帮助开发者实现复杂的查询、转换和格式化任务,提升数据库操作的灵活性和效率。了解并熟练运用这些函数,对于提高数据库管理的技能和提升工作效率至关重要...

    解决Oracle没有WM_CONCAT函数.zip

    1. 使用LISTAGG函数:从Oracle 11g开始,官方提供了LISTAGG函数,它可以按照指定的分隔符连接字符串。例如: ```sql SELECT LISTAGG(column, ', ') WITHIN GROUP (ORDER BY column) AS aggregated_column FROM ...

    oracle split 函数

    在Oracle数据库中,处理字符串是一项常见的需求,尤其是在需要将包含特定分隔符的字符串分割成多个独立的部分时。Oracle标准SQL并没有提供直接用于字符串分割的内置函数,因此开发者通常会通过自定义函数的方式来...

    oracle split函数

    在Oracle数据库中,并没有内置的split函数来处理字符串的分割操作。然而,在实际应用中,经常需要将一个包含多个值的字符串按照指定的分隔符进行拆分,转换为表格式的数据,以便进行进一步的处理或查询。为此,可以...

    oracle sql 内置函数大全

    Oracle SQL 内置函数是数据库查询和操作的重要组成部分,它们极大地简化了数据处理的复杂性。在Oracle 8i版本中,提供了丰富的函数集来处理...因此,对于任何Oracle数据库的使用者来说,掌握这些函数都是至关重要的。

Global site tag (gtag.js) - Google Analytics