MySQL сказал: # 1338 - Объявление курсора после объявления обработчика - PullRequest
0 голосов
/ 01 ноября 2018

Я занимаюсь разработкой веб-проекта, и у меня возникли проблемы с миграцией из базы данных Oracle в базу данных MySQL. Я хочу создать функцию с этим кодом:

DROP FUNCTION IF EXISTS F_MANIFEST_GABUNG_SMR;

DELIMITER //

CREATE FUNCTION F_MANIFEST_GABUNG_SMR (input_val   varchar(4000))
  RETURNS VARCHAR(4000)
BEGIN
  DECLARE return_text  VARCHAR(10000)  DEFAULT  NULL;
DECLARE not_found INT DEFAULT 0;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1; 
  DECLARE x CURSOR FOR SELECT DISTINCT IFNULL(SMR,'-') SMR FROM MANIFEST_EDI_SMR WHERE BL_NBR = input_val; OPEN x;
 FETCH x INTO;
 WHILE NOT_FOUND=0
 DO
    SET return_text = concat(ifnull(return_text, '') , ' ' , IFNULL(x.SMR, '')) ;
  FETCH  INTO;
  END WHILE;
  CLOSE ;
  IF char_length(return_text) > 85 THEN
       SET return_text = concat(ifnull(substr(return_text,1,85), '') , ' detail asp BL'); 
  END IF;
  RETURN return_text;
END;
//

DELIMITER ;

Я использую phpmyadmin для хранения функций с помощью рутины. Спасибо за вашу помощь:)

1 Ответ

0 голосов
/ 01 ноября 2018

Сообщение об ошибке говорит само за себя: вы объявляете курсор после обработчика, необходимо изменить порядок:

DROP FUNCTION IF EXISTS F_MANIFEST_GABUNG_SMR;

DELIMITER //

CREATE FUNCTION F_MANIFEST_GABUNG_SMR (input_val   varchar(4000))
  RETURNS VARCHAR(4000)
BEGIN
  DECLARE return_text  VARCHAR(10000)  DEFAULT  NULL;
DECLARE not_found INT DEFAULT 0;

-- Declare cursor before handler
DECLARE x CURSOR FOR SELECT DISTINCT IFNULL(SMR,'-') SMR 
 FROM MANIFEST_EDI_SMR WHERE BL_NBR = input_val; OPEN x;

-- handler need to be after cursor
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1; 

 FETCH x INTO;
 WHILE NOT_FOUND=0
 DO
    SET return_text = concat(ifnull(return_text, '') , ' ' , IFNULL(x.SMR, '')) ;
  FETCH  INTO;
  END WHILE;
  CLOSE ;
  IF char_length(return_text) > 85 THEN
       SET return_text = concat(ifnull(substr(return_text,1,85), '') , ' detail asp BL'); 
  END IF;
  RETURN return_text;
END;
//

DELIMITER ;

Более подробную информацию можно найти по адресу: https://dev.mysql.com/doc/refman/8.0/en/cursors.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...