2017-02-09 1 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 할 수 있다고 생각하지 않는다. 변수의

과제 중 하나 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

가장 큰 객체와 가장 작은 객체에 대해 'MAX'값이있는 'MIN'값을 계산해야하는 경우 어떻게해야합니까? 단일 쿼리에서이 작업을 수행 할 수 있습니까? 질문 내가 수정 한 내용을 더 잘 설명하도록 수정했습니다. – Raj

+0

@Rajkishan : 스토어드 프로 시저 구문에 대한 질문이 다른 것으로 바뀌 었습니다. 이제는 [태그 : 그룹당 최대 n 개]를 효율적으로 찾을 수 있습니다. 하루에 여러 번 요청됩니다. 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

관련 문제