将SQL Server代码转换为Oracle函数

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
ranjing9 回答:将SQL Server代码转换为Oracle函数

这看起来像是写得不好的函数。

如果您需要执行与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
本文链接:https://www.f2er.com/3024133.html

大家都在问