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

ストアドプロシージャにはいくつか問題があります。 1つは、IFステートメントの一部としてdeclareのカーソルを使用できないと思います。変数の

割り当て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はあなたにもFROM句なしSELECTステートメントを使用することはできません

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

にする必要がある、と私はあなただけ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

bigとsmallestオブジェクトの 'MAX'値で' MIN'値を計算する必要がある場合はどうすればいいですか?私は単一のクエリでそれを行うことはできますか?あなたが知っていることをよりよく説明するために変更された質問 – Raj

+0

@Rajkishan:ストアドプロシージャの構文に関する質問が何か違うものになってしまった。今、[タグ:グループあたりの最大のn]を効率的に見つけることができました。これは1日に数回お願いしています。こちらをご覧ください: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

関連する問題