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