2017-02-09 108 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