HSQL SELECT语句不起作用

时间:2017-02-09 06:56:48

标签: hsqldb

我是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

这不是正确的语法吗?

感谢任何帮助:)

2 个答案:

答案 0 :(得分: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`

您也不能使用没有SELECT子句的FROM语句,我也不认为您可以定义仅从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;

答案 1 :(得分:0)

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

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

我希望它会帮助你。