【问题标题】:Return char value in SQL function using output from SELECT statement使用 SELECT 语句的输出在 SQL 函数中返回 char 值
【发布时间】:2016-02-01 14:39:28
【问题描述】:

我想创建一个输出 CHAR 值的函数。我设法创建了一个 SELECT 语句,它只输出我需要的那个特定值的列和行。但是,当我尝试使用此函数时,我收到一个错误代码,指出输出值无效(SQLCODE=-946-Result set not allowed) 我的函数如下所示:

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

如您所见,该功能相当简单。我只想输出可以通过获取飞机所在的最后一个机场来确定的飞机位置(现在与到达时间进行比较)。 “航班”表如下所示:

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

所需的输出将是 MUC,因为它是截至目前 (2016-02-01) 最后一个机场。洛杉矶国际机场是未来。 STG 在 MUC 之前,MIA 可以忽略,因为它是另一个平面。

解决这个问题的方法可能很简单,但我无法理解它。我还尝试了 SET 命令和 DECLARE。我可能用错了。使用 Sybase SQL Anywhere 12

【问题讨论】:

    标签: sql function sybase sqlanywhere


    【解决方案1】:

    在 SQL Server(与 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
    

    【讨论】:

    • 击败我半秒 :)
    • 感谢您的帮助!原来我还必须添加AS
    【解决方案2】:

    感谢两位的帮助!我终于让它工作了。是的,您对明确的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
    

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多