"DECLARE" недопустимо в этой позиции для этой версии сервера, ожидая: ERROR - PullRequest
0 голосов
/ 19 марта 2020

Я пытался всеми возможными способами поместить "DECLARE" в свой процедурный запрос SQL (с использованием MySQL Workbench) и его отображение:

"DECLARE" недопустимо в этой позиции для этой версии сервера, ожидая: ОШИБКА.

Теперь мне нужна помощь.

DELIMITER //

CREATE PROCEDURE getdetails()
BEGIN 
    DECLARE 
        vin table.vin%type; 
        responsetime table.responseTimeStamp%type;
        odometer table.odometer%type;
        chargePercentage table.soc%type;
        CURSOR sequential_vehicle_status is
                SELECT vin, responseTimeStamp, odometer, soc FROM table ORDER BY vin, responseTimeStamp;
    OPEN sequential_vehicle_status;
    LOOP
    FETCH sequential_vehicle_status into vin, responseTimeStamp, odometer, chargePercentage;
        EXIT WHEN sequential_vehicle_status%notfound;
        dbms_output.put_line(vin || " * " || responseTimeStamp || " * " || odometer || " * " || chargePercentage || "% " ||);
    END LOOP;
    CLOSE sequential_vehicle_status;
END //

DELIMITER ;

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Этот код будет работать. Вот демоверсия . Настройте объявленные переменные в соответствии с типами столбцов таблицы.

CREATE PROCEDURE getdetails()
BEGIN

DECLARE finished INTEGER DEFAULT 0; --this is added so the exit from loop can be made

DECLARE vin int; 
DECLARE responseTimeStamp int;
DECLARE odometer int;
DECLARE chargePercentage int;
DECLARE sequential_vehicle_status 
cursor for
    SELECT vin
           , responseTimeStamp
           , odometer
           , soc 
    FROM `table` 
    ORDER BY vin, responseTimeStamp;

DECLARE CONTINUE HANDLER 
    FOR NOT FOUND SET finished = 1;--this is added so the exit from loop can be made

OPEN sequential_vehicle_status;
start_loop: LOOP

IF finished = 1 THEN 
        LEAVE start_loop;
    END IF;

FETCH sequential_vehicle_status into vin
                                     , responseTimeStamp
                                     , odometer
                                     , chargePercentage;

select concat(vin, '*', responseTimeStamp, '*', odometer, '*', chargePercentage, '% ');                                         

END LOOP;
CLOSE sequential_vehicle_status;

END;

Прочтите комментарии к своему вопросу. DBMS_OUTPUT - это oracle пакет. Вместо этой строки кода dbms_output вы можете добавить это:

select concat(vin, '*', responseTimeStamp, '*', odometer, '*', chargePercentage, '% ');      
0 голосов
/ 19 марта 2020

Вы комбинируете оба синтаксиса mysql и oracle. Dbms_output - это пакет в oracle, а предложение IS используется в oracle для создания курсора.

    CREATE PROCEDURE getdetails()
        BEGIN 
            DECLARE vin table.vin%type; 
            DECLARE responsetime table.responseTimeStamp%type;
            DECLARE odometer table.odometer%type;
            DECLARE chargePercentage table.soc%type;
            DECLARE CURSOR sequential_vehicle_status for 
                        SELECT vin, responseTimeStamp, odometer, soc FROM table ORDER BY vin, responseTimeStamp;

Также, если вы хотите распечатать что-то на консоли, используйте вместо этого dbms_output, который является oracle package.

ie. SELECT concat('VIN is ', vin);

...