首页 > 解决方案 > 将 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

标签: oracleplsqldatabase-migration

解决方案


这看起来像是一个写得很糟糕的函数。

如果您需要像 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

推荐阅读