2014-01-07 2 views
0

Я хочу использовать курсор в моем проекте, но он бросает ошибку 1064. Помогите мне в решении проблемы .....курсор не работает в хранимой процедуре, он бросает ошибку 1064

Код ошибки: 1064 У вас возникла ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с 'DECLARE CURSOR curs1 FOR SELECT healthinsurancepremium.productid, healthinsuran' в строке 63

Мой Процедура Код:

CR-EATE DEFINER=`root`@`localhost` PROCEDURE `spGettestOffline` (
    IN in_sumassured INT(10), 
    IN in_age INT(3), 
    IN in_adult INT(4), 
    IN in_child INT(4), 
    IN in_tenure INT(3), 
    IN in_city VARCHAR(20) 
) 

BEGIN 

    DECLARE bDone INT DEFAULT 0; 
    DECLARE var1 INT ; 
    DECLARE Var2 INT; 
    DECLARE Var3 INT; 
    DECLARE var4 INT; 

    /* this is the table declaration */ 
    DROP TEMPORARY TABLE IF EXISTS tblResults; 
     CREATE TEMPORARY TABLE IF NOT EXISTS tblResults (
     productid INT, 
     suminsured INT, 
     amount INT, 
     tenent INT 
     ); 

    /* this is the cursor declaration */ 
    DECLARE curs1 CURSOR FOR SELECT healthinsurancepremium.productid ,healthinsurancepremium.suminsured ,healthinsurancepremium.amount ,healthinsurancepremium.tenure FROM healthinsurancepremium LEFT JOIN `cityspecifichealthpremium` ON `healthinsurancepremium`.`id` >= `cityspecifichealthpremium`.`healthpremiumidmin` AND `healthinsurancepremium`.`id` <= `cityspecifichealthpremium`.`healthpremiumidmax` WHERE (`cityspecifichealthpremium`.`healthpremiumidmax` IS NULL AND `cityspecifichealthpremium`.`healthpremiumidmin` IS NULL) AND healthinsurancepremium.suminsured = in_sumassured AND in_age >=healthinsurancepremium.minage AND in_age <=healthinsurancepremium.maxage AND healthinsurancepremium.adult=in_adult AND healthinsurancepremium.child=in_child ; 

    /* this is the cursor looping */ 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1; 
    OPEN curs1; 

    read_loop: LOOP 
     FETCH curs1 INTO var1,var2,var3,var4; 

     INSERT INTO tblResults VALUES (var1,var2, var3,var4); 

     IF (bDone = 1) THEN 
      LEAVE read_loop; 
     END IF; 

    END LOOP; 
    CLOSE curs1; 

    SELECT * FROM tblResults; 

END$$ 

Я думаю, что эта проблема относится к части декларации курсора .... но я ничего не нашел на ней

ответ

1

Вы положили заявление DECLARE в неправильное место.

условия использования на DECLARE заявления:

Вы должны DECLARE их явно в начале BEGIN/END блок, наряду с их типами данных.

Переместить все свои DECLARE ... оперативные заявления в начало блока BEGIN. Он должен выглядеть следующим образом:

BEGIN 
    DECLARE bDone INT DEFAULT 0; 
    DECLARE var1 INT ; 
    DECLARE Var2 INT; 
    DECLARE Var3 INT; 
    DECLARE var4 INT; 
    DECLARE curs1 CURSOR FOR 
     SELECT 
      healthinsurancepremium.productid, 
      healthinsurancepremium.suminsured, 
      healthinsurancepremium.amount, 
      healthinsurancepremium.tenure 
     FROM healthinsurancepremium 
      LEFT JOIN `cityspecifichealthpremium` ON 
      `healthinsurancepremium`.`id` >= `cityspecifichealthpremium`.`healthpremiumidmin` AND 
      `healthinsurancepremium`.`id` <= `cityspecifichealthpremium`.`healthpremiumidmax` 
      WHERE 
      (`cityspecifichealthpremium`.`healthpremiumidmax` IS NULL AND 
      `cityspecifichealthpremium`.`healthpremiumidmin` IS NULL) AND 
      healthinsurancepremium.suminsured = in_sumassured AND 
      in_age >= healthinsurancepremium.minage AND 
      in_age <= healthinsurancepremium.maxage AND 
      healthinsurancepremium.adult = in_adult AND 
      healthinsurancepremium.child = in_child ; 

См: Stored Procedures - MySQL

+0

спасибо ... но тогда, когда я должен поставить создать временный раздел таблицы .. внутри курсора или где? – user3168097

+0

@ user3168097: Вы можете поместить его после всех утверждений 'DECLARE'. –

Смежные вопросы