将 SQL 服务器代码转换为 Oracle 函数
Convert SQL Server code to Oracle function
CREATE FUNCTION dbo.Alphaorder (@str VARCHAR(50))
returns VARCHAR(50)
BEGIN
DECLARE @len INT,
@cnt INT =1,
@str1 VARCHAR(50)='',
@output VARCHAR(50)=''
SELECT @len = Len(@str)
WHILE @cnt <= @len
BEGIN
SELECT @str1 += Substring(@str, @cnt, 1) + ','
SET @cnt+=1
END
SELECT @str1 = LEFT(@str1, Len(@str1) - 1)
SELECT @output += Sp_data
FROM (SELECT Split.a.value('.', 'VARCHAR(100)') Sp_data
FROM (SELECT Cast ('<M>' + Replace(@str1, ',', '</M><M>') +
'</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)) A
ORDER BY Sp_data
RETURN @output
END
SELECT dbo.Alphaorder ('juan') --> ajnu
这看起来像是一个写得不好的函数。
如果您需要像 Oracle SQL 中的函数那样做一些事情,您可以直接使用 Oracle SQL 特性来完成,您不需要编写自己的函数。
即使出于某种原因你 需要编写一个函数,让 SQL 为你完成工作可能是最简单的(就像你会做的一样)如果你的上下文是直接的 SQL).
像这样:
create or replace function alphaorder(str varchar2) return varchar2
as
output varchar2(4000);
begin
select listagg(ch) within group (order by ch)
into output
from ( select substr(str, level, 1) as ch
from dual
connect by level <= length(str)
)
;
return output;
end;
/
请注意,在 Oracle 中,您不能限制输入或输出字符串的长度;您只能声明数据类型。然后在函数本身中,您可以检查长度并在输入超过 50 个字符时抛出错误,但何必呢?让函数在完全通用的情况下工作。
调用函数的方式如下(并检查它是否按要求工作):
select alphaorder('juan') as alpha_ordered from dual;
ALPHA_ORDERED
-------------
ajnu
CREATE FUNCTION dbo.Alphaorder (@str VARCHAR(50))
returns VARCHAR(50)
BEGIN
DECLARE @len INT,
@cnt INT =1,
@str1 VARCHAR(50)='',
@output VARCHAR(50)=''
SELECT @len = Len(@str)
WHILE @cnt <= @len
BEGIN
SELECT @str1 += Substring(@str, @cnt, 1) + ','
SET @cnt+=1
END
SELECT @str1 = LEFT(@str1, Len(@str1) - 1)
SELECT @output += Sp_data
FROM (SELECT Split.a.value('.', 'VARCHAR(100)') Sp_data
FROM (SELECT Cast ('<M>' + Replace(@str1, ',', '</M><M>') +
'</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)) A
ORDER BY Sp_data
RETURN @output
END
SELECT dbo.Alphaorder ('juan') --> ajnu
这看起来像是一个写得不好的函数。
如果您需要像 Oracle SQL 中的函数那样做一些事情,您可以直接使用 Oracle SQL 特性来完成,您不需要编写自己的函数。
即使出于某种原因你 需要编写一个函数,让 SQL 为你完成工作可能是最简单的(就像你会做的一样)如果你的上下文是直接的 SQL).
像这样:
create or replace function alphaorder(str varchar2) return varchar2
as
output varchar2(4000);
begin
select listagg(ch) within group (order by ch)
into output
from ( select substr(str, level, 1) as ch
from dual
connect by level <= length(str)
)
;
return output;
end;
/
请注意,在 Oracle 中,您不能限制输入或输出字符串的长度;您只能声明数据类型。然后在函数本身中,您可以检查长度并在输入超过 50 个字符时抛出错误,但何必呢?让函数在完全通用的情况下工作。
调用函数的方式如下(并检查它是否按要求工作):
select alphaorder('juan') as alpha_ordered from dual;
ALPHA_ORDERED
-------------
ajnu