我有一个逗号分隔的字符串,它从Java代码传递给存储过程。
例如
admin,role,user
现在如何拆分此字符串并将其填充到oracle PL / SQL
中的数组中第二个问题是,当我们在SQL server中执行它时,此函数是否有效?
答案 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