我有一个从Java代码传递给存储过程的逗号分隔字符串。在oracle中分割字符串pl sql
例如
管理,角色,用户
现在我怎么拆分此字符串,并将其填充到Oracle PL/SQL
第二个问题是一个数组,当我们在SQL服务器中执行它时,这个函数是否有效?
我有一个从Java代码传递给存储过程的逗号分隔字符串。在oracle中分割字符串pl sql
例如
管理,角色,用户
现在我怎么拆分此字符串,并将其填充到Oracle PL/SQL
第二个问题是一个数组,当我们在SQL服务器中执行它时,这个函数是否有效?
SQL一边,有在T-SQL没有本地分割功能,但有一个CLR函数,它的一个很好的例子同样by Erland Sommarskog here
这是不可能的,一个Oracle功能将在SQL有效服务器,SQL语句通常需要从一种风格转换到另一种风格。但是,如果您的客户端使用的是通用驱动程序(例如odbc或.net),那么您可能可以将此功能转移到客户端,并使其与两个数据库一起工作。使用
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, ',');
请您尝试使用下面的查询:
--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
虽然你可以编写功能在每个数据库中解析您的字符串,如果在未来添加新值,您将冒着违反解析器规则的风险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转换为更有用的东西都是微不足道的。
这听起来像一个糟糕的数据库设计。也许你应该考虑规范你的数据 –