【发布时间】:2021-01-26 03:51:57
【问题描述】:
函数代码如下:
CREATE OR REPLACE FUNCTION FTTH_GETBUSZONECODEMULTI(
p_house_nbr IN VARCHAR2,
p_as_of_date IN DATE DEFAULT SYSDATE)
RETURN VARCHAR2
AS
CURSOR l_get_cur
IS
SELECT
LTRIM(RTRIM(BZO.B2FEDC)) BusinessZoneCode
FROM
[not wasting your time with business logic]
l_return VARCHAR2(32767);
BEGIN
--
FOR l_get_rec IN l_get_cur LOOP
l_return := l_return || '|' || l_get_rec.BusinessZoneCode;
END LOOP;
--
CASE
WHEN l_return IS NULL THEN RETURN NULL;
ELSE RETURN l_return || '|';
END CASE;
--
END FTTH_GETBUSZONECODEMULTI;
我的翻译尝试如下:
CREATE FUNCTION ftth_GETBUSZONECODEMULTI(
@p_house_nbr VARCHAR(4000),
@p_as_of_date DATETIME)
RETURNS VARCHAR(4000)
AS
BEGIN
SET @p_as_of_date = GETDATE()
DECLARE l_get_cur CURSOR LOCAL
FOR
SELECT
LTRIM(RTRIM(BZO.B2FEDC)) BusinessZoneCode
FROM
[not wasting your time with business logic]
DECLARE @l_return VARCHAR(MAX);
--
SET @l_return = isnull(@l_return, '') + '|' + ISNULL((FETCH BusinessZoneCode from l_get_cur), '');
--
if @l_return IS NULL begin RETURN NULL END
if @l_return is not null BEGIN RETURN isnull(@l_return, '') + '|' END;
END
我认为,问题在于我如何尝试获取该值 - 即使我在其中放置了“NEXT”,它也无法正常工作。我已经尝试了 6 种不同的方式来安排 FETCH,但它们都不起作用。
【问题讨论】:
-
您真的想要一个多行标量函数中的
CURSOR吗?那会表现得很糟糕。您需要一个内联表值函数。 -
这只是简单的字符串连接/聚合吗?并始终确定您正在使用的 sql server 的版本和版本。 TSQL 有一个
TRIM函数已经有一段时间了。 -
这个函数的实际目标是什么?
-
它的用途让我大吃一惊,我只是一个迁移猴子,一个接一个地执行一个函数,但我知道我不能使用表值函数,因为它被调用选择语句。它根本不会有性能,但客户设定了一个非常紧迫的截止日期,速度不是交易的一部分哈哈
-
“我不知道它的用途是什么,” 然后找出或弄清楚它的作用;如果您要迁移它您需要了解它。
标签: sql sql-server tsql plsql