2017-02-09 57 views
0

我是HSQL中的新成员。尝试了如下的程序;HSQL SELECT语句不起作用

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` 

你也不能使用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; 
+0

如果我需要为最大和最小的对象计算“MIN”值和MAX值,该怎么办?我可以在单个查询中完成吗?问题修改为更好地描述我的意思 – Raj

+0

@Rajkishan:您知道将有关存储过程语法的问题转化为不同的东西。现在是关于高效地找到[tag:most-n-per-group]。这是每天要问几次,请看这里:http://stackoverflow.com/questions/tagged/greatest-n-per-group+sql –

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 

我希望它能帮助你。

+0

但它增加的参数的数量。我不能那样做。我正在写这个测试。没有其他办法吗? – Raj