在oracle pl sql中拆分字符串

时间:2011-12-07 09:30:03

标签: sql-server arrays oracle plsql

我有一个逗号分隔的字符串,它从Java代码传递给存储过程。

例如

  

admin,role,user

现在如何拆分此字符串并将其填充到oracle PL / SQL

中的数组中

第二个问题是,当我们在SQL server中执行它时,此函数是否有效?

4 个答案:

答案 0 :(得分:2)

function str2tbl      (p_str in varchar2,p_delim in varchar2 default '.') return myTableType
  is
      l_str        long default p_str || p_delim;
       l_n        number;
       l_data     myTableType := myTabletype();
  begin
       loop
           l_n := instr( l_str, p_delim );
           exit when (nvl(l_n,0) = 0);
          l_data.extend;
           l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
           l_str := substr( l_str, l_n+length(p_delim) );
     end loop;
     return l_data;
  end str2tbl;

使用示例:

TYPE myTableType is table of varchar2(100);
v_array mytabletype;
v_array := str2tbl (string, ',');

答案 1 :(得分:1)

虽然您可以在每个数据库中编写函数来解析字符串,但如果将来添加新值,您可能会违反解析器规则(在您的情况下,想象一些人决定将“Admin,Super”添加为用户。)更好的方法是使用为此目的而设计的结构。

在Oracle中,您可以执行以下操作:

create type Varchar10List as table of varchar(10);

create function YourFunction (pRoles Varchar10List) as
...

但这对SQL Server无效。 SQL Server确实有类型的表类型参数,但Java尚不支持它们。

如果您想更通用地执行此操作,则可以将列表作为非常简单的XML传递。此时几乎所有数据库服务器都集成了XML解析器,因此无论您使用的是Oracle还是SQL Server,将XML转换为更实用的东西都是微不足道的。

答案 2 :(得分:0)

在SQL方面,T-SQL中没有本机拆分功能,但是有一个很好的CLR函数示例可以执行相同的by Erland Sommarskog here

Oracle函数不太可能在SQL Server中有效,SQL语句通常需要从一种风格转换为另一种风格。但是,如果您的客户端使用诸如odbc或.net之类的公共驱动程序,那么您可以将此功能转移到客户端并使其适用于两个数据库。

答案 3 :(得分:0)

请尝试以下查询:

--Creating function
CREATE FUNCTION GetSplittedData( @dataToSplit VARCHAR(500) )
RETURNS VARCHAR(500)
AS
BEGIN
    RETURN (''''+REPLACE(@dataToSplit, ',', ''',''')+'''')
END

--Calling function with data
SELECT DBO.GetSplittedData('admin,role,user')

更新:这是根据sql server