oracle - 将 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
解决方案
这看起来像是一个写得很糟糕的函数。
如果您需要像 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
推荐阅读
- python-2.7 - 我应该如何格式化我的收益请求?
- android - 当我使用显示尺寸进行可访问性时,有没有办法避免增加图像尺寸?
- regex - 正则表达式 - 即使被填充文本包围也匹配模式
- flutter - 调试 Flutter 应用程序的方法有哪些?
- c# - 从上下文菜单中访问列表视图(选定)项目
- navigation - 如何在不知道用户来自哪个页面的情况下返回一些数据
- c# - OnMouseDown 在 Vuforia 中不起作用 - Unity C#
- javascript - 变量在调试器中显示为“未定义”
- google-places-api - Place Details API 间歇性地不返回所有字段
- android - 在 Flutter Form Widget 中动态添加字段