HSQL SELECT 语句不起作用

Posted

技术标签:

【中文标题】HSQL SELECT 语句不起作用【英文标题】:HSQL SELECT Statement Not working 【发布时间】:2017-02-09 06:56:48 【问题描述】:

我是 HSQL 的新手。尝试了如下程序;

CREATE PROCEDURE GetData(ObjectId VARCHAR(36)) READS SQL DATA 
DYNAMIC RESULT SETS 1
BEGIN ATOMIC
    DECLARE MaxVal NUMERIC(19,2);
    DECLARE MinVal NUMERIC(19,2);
    DECLARE BiggestObjectName VARCHAR(50);
    DECLARE SmallestObjectName VARCHAR(50);

    SET MaxVal = (SELECT MAX(HeightValue) FROM ObjectData WHERE ObjectId=ObjectId);
    SET MinVal = (SELECT MIN(HeightValue) FROM ObjectData WHERE ObjectId=ObjectId);
    SET BiggestObjectName = (SELECT ObjectName FROM ObjectData WHERE ObjectId=ObjectId AND HeightValue=MaxVal);
    SET SmallestObjectName = (SELECT ObjectName FROM ObjectData WHERE ObjectId=ObjectId AND HeightValue=MinVal);

  if MaxVal IS NOT NULL THEN
    DECLARE result CURSOR WITH RETURN FOR
        SELECT MaxVal AS MaximumHeight, MinVal AS MinimumHeight, BiggestObjectName AS LargestDisplayCaseName, SmallestObjectName AS SmallestDisplayCaseName FOR READ ONLY;
  OPEN result;
END

但我得到错误;

Caused by: java.sql.SQLSyntaxErrorException: unexpected token: ; required: INTO

语法不正确吗?

任何帮助表示赞赏:)

【问题讨论】:

【参考方案1】:

您的存储过程有几个问题。一方面,我认为您不能将declare 游标作为IF 语句的一部分。

变量的赋值需要使用select ... into或者你需要将select语句放在括号之间:

SET MaxVal = (SELECT MAX(HeightValue) FROM ObjectData WHERE ObjectId=ObjectId);
SET ObjectName = (SELECT ObjectName FROM ObjectData WHERE ObjectId=ObjectId AND HeightValue=MaxVal);

SELECT MAX(HeightValue) 
  into maxval
FROM ObjectData 
WHERE ObjectId=ObjectId;

您也不能使用=<> 来比较NULL 的值。 if MaxVal != NULL THEN 必须是

if maxval is not null then 
   ...
end if; --<< you also forgot the `end if`

你也不能使用没有FROM 子句的SELECT 语句,而且我认为你不能定义一个只从HSQLDB 中的变量中选择值的游标。

但无论如何都不需要中间选择,您可以在单个选择中完成:

CREATE PROCEDURE GetData(ObjectId VARCHAR(36)) READS SQL DATA 
DYNAMIC RESULT SETS 1
BEGIN ATOMIC

  DECLARE result CURSOR FOR
    select o1.heightvalue as maximumheight, o1.objectname as displaycasename
    from objectdata o1
    where objectid = 'one' 
    and heightvalue = (select max(heightvalue) 
                       from objectdata o2 
                       where o2.objectid = o1.objectid);

  OPEN result;

END;

【讨论】:

如果我需要用MAX 计算最大和最小对象的MIN 值怎么办?我可以在一个查询中完成吗?修改问题以更好地描述我的意思 @Rajkishan:你知道把关于存储过程语法的问题变成了不同的东西。现在是关于有效地找到greatest-n-per-group。这一天会被问好几次,请看这里:***.com/questions/tagged/greatest-n-per-group+sql【参考方案2】:

您没有使用正确的语法来创建过程。根据语法,您必须将从表中选择的值放入局部变量中。请按照以下示例进行操作。

CREATE PROCEDURE get_customer(IN id INT, OUT firstname VARCHAR(50), OUT lastname VARCHAR(50)) 
    READS SQL DATA
    BEGIN ATOMIC
    -- this statement uses the id to get firstname and lastname
    SELECT first_name, last_name INTO firstname, lastname FROM customers WHERE cust_id = id;
END

希望对你有帮助。

【讨论】:

但它正在增加参数的数量。我不能那样做。我写这个是为了测试。没有别的办法吗?

以上是关于HSQL SELECT 语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java中带有sum的SQL语句不起作用

HSQL 在 Spring 引导测试中不起作用

SQL Server,临时表,SELECT 语句不起作用

Oracle 将 select 声明为 update 语句不起作用

BigQuery 的 WHERE 子句中的 SELECT 语句不起作用

SQL 视图别名在 H2 SELECT 语句中不起作用