2011-12-07 50 views
0

我有一个从Java代码传递给存储过程的逗号分隔字符串。在oracle中分割字符串pl sql

例如

管理,角色,用户

现在我怎么拆分此字符串,并将其填充到Oracle PL/SQL

第二个问题是一个数组,当我们在SQL服务器中执行它时,这个函数是否有效?

+0

这听起来像一个糟糕的数据库设计。也许你应该考虑规范你的数据 –

回答

0

SQL一边,有在T-SQL没有本地分割功能,但有一个CLR函数,它的一个很好的例子同样by Erland Sommarskog here

这是不可能的,一个Oracle功能将在SQL有效服务器,SQL语句通常需要从一种风格转换到另一种风格。但是,如果您的客户端使用的是通用驱动程序(例如odbc或.net),那么您可能可以将此功能转移到客户端,并使其与两个数据库一起工作。使用

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, ','); 
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

1

虽然你可以编写功能在每个数据库中解析您的字符串,如果在未来添加新值,您将冒着违反解析器规则的风险e(在你的情况下,想象一些决定添加“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转换为更有用的东西都是微不足道的。