Return SQL 函数中的字符值使用 SELECT 语句的输出
Return char value in SQL function using output from SELECT statement
我想创建一个输出 CHAR 值的函数。我设法创建了一个 SELECT 语句,它只输出我需要的那个特定值的列和行。然而,当我尝试使用这个函数时,我得到一个错误代码,指出输出值无效(SQLCODE=-946-Result set not permitted)
我的函数如下所示:
ALTER FUNCTION "DBA"."findLocation"(@airplane INTEGER)
RETURNS char(3)
BEGIN
SELECT TOP 1 airport FROM flights
WHERE arrivalTime <= now() and airplaneID = @airplane
ORDER BY arrivalTime DESC
END
如您所见,该函数非常简单。我只想输出飞机的位置,可以通过获取飞机的最后一个机场来确定(现在与到达时间进行比较)。
table "flights" 看起来像这样:
Airport (char(3)) | arrivalTime (timestamp) | airplaneID (integer)
MUC | 2016-01-01 15:00:00.123456 | 1
LAX | 2016-02-10 15:00:00.123456 | 1
STG | 2015-01-01 15:00:00.123456 | 1
MIA | 2016-01-05 15:00:00.123456 | 2
我用以下函数执行函数:
findLocation(1)
或
SELECT findLocation(1) FROM flights
所需的输出将是截至目前 (2016-02-01) 最后一个机场的 MUC。 LAX在未来。 STG在MUC之前,MIA可以忽略,因为是另外一个平面
这个问题的解决方案可能很简单,但我无法解决这个问题。我还尝试了 SET 命令和 DECLARE。我可能用错了。 Sybase SQL 任何地方都使用 12
在SQL 服务器(与Sybase 非常相似)中,您需要一个明确的return
。也许这会解决您的问题:
ALTER FUNCTION "DBA"."findLocation"(@airplane INTEGER)
RETURNS char(3)
BEGIN
DECLARE @retval char(3);
SELECT TOP 1 @retval = airport FROM flights
WHERE arrivalTime <= now() and airplaneID = @airplane
ORDER BY arrivalTime DESC
RETURN @retval;
END
谢谢两位的帮助!我终于让它工作了。是的,你关于显式 return
的地方是正确的,我还必须添加一个 AS
。我花了很长时间尝试 AS
...结果证明它很重要。
ALTER FUNCTION "DBA"."findLocation"(@airplane integer)
RETURNS char(3)
AS
BEGIN
DECLARE @location char(3)
SET @location = (
SELECT TOP 1 airport FROM flights
WHERE arrivaltime <= now() AND airplaneID = @airplane
ORDER BY arrivaltime desc)
RETURN @location
END
我想创建一个输出 CHAR 值的函数。我设法创建了一个 SELECT 语句,它只输出我需要的那个特定值的列和行。然而,当我尝试使用这个函数时,我得到一个错误代码,指出输出值无效(SQLCODE=-946-Result set not permitted) 我的函数如下所示:
ALTER FUNCTION "DBA"."findLocation"(@airplane INTEGER)
RETURNS char(3)
BEGIN
SELECT TOP 1 airport FROM flights
WHERE arrivalTime <= now() and airplaneID = @airplane
ORDER BY arrivalTime DESC
END
如您所见,该函数非常简单。我只想输出飞机的位置,可以通过获取飞机的最后一个机场来确定(现在与到达时间进行比较)。 table "flights" 看起来像这样:
Airport (char(3)) | arrivalTime (timestamp) | airplaneID (integer)
MUC | 2016-01-01 15:00:00.123456 | 1
LAX | 2016-02-10 15:00:00.123456 | 1
STG | 2015-01-01 15:00:00.123456 | 1
MIA | 2016-01-05 15:00:00.123456 | 2
我用以下函数执行函数:
findLocation(1)
或
SELECT findLocation(1) FROM flights
所需的输出将是截至目前 (2016-02-01) 最后一个机场的 MUC。 LAX在未来。 STG在MUC之前,MIA可以忽略,因为是另外一个平面
这个问题的解决方案可能很简单,但我无法解决这个问题。我还尝试了 SET 命令和 DECLARE。我可能用错了。 Sybase SQL 任何地方都使用 12
在SQL 服务器(与Sybase 非常相似)中,您需要一个明确的return
。也许这会解决您的问题:
ALTER FUNCTION "DBA"."findLocation"(@airplane INTEGER)
RETURNS char(3)
BEGIN
DECLARE @retval char(3);
SELECT TOP 1 @retval = airport FROM flights
WHERE arrivalTime <= now() and airplaneID = @airplane
ORDER BY arrivalTime DESC
RETURN @retval;
END
谢谢两位的帮助!我终于让它工作了。是的,你关于显式 return
的地方是正确的,我还必须添加一个 AS
。我花了很长时间尝试 AS
...结果证明它很重要。
ALTER FUNCTION "DBA"."findLocation"(@airplane integer)
RETURNS char(3)
AS
BEGIN
DECLARE @location char(3)
SET @location = (
SELECT TOP 1 airport FROM flights
WHERE arrivaltime <= now() AND airplaneID = @airplane
ORDER BY arrivaltime desc)
RETURN @location
END