声明在此职位无效,期望

时间:2019-05-30 09:24:58

标签: mysql sql mysql-workbench

已声明正在尝试解决的错误。和以前使用相同语法但不会引发任何错误的过程一样奇怪

这是一个过程,该过程使用游标从一个表中检索信息,然后将其插入到另一个表中,这样做是为了使其中的信息可以用来计算总数,并与一些信息一起传递必需值

BEGIN
     DECLARE fin INT DEFAULT FALSE;
     DECLARE pol VARCHAR(30) default '';
     DECLARE total_accrued decimal(20,2) DEFAULT '0.00';
     DECLARE total_paid decimal(20,2) DEFAULT '0';
     DECLARE TOTAL DECIMAL(20,2) DEFAULT '0.00';
     DECLARE user_pol varchar(45) default '';

     DECLARE c3 CURSOr FOR SELECT total_accrued FROM fn_policy_mast;
     DECLARE c4 CURSOR FOr SELECT total_amount_paid FROM fn_policy_mast;
     DECLARE c2 CURSOR FOR SELECt policy_number FROM fn_policy_mast;
     DECLARE c1 CURSOr FOR SELECT balance FROM fn_policy_mast;

    -- DECLARE d_policy CURSOR FOR SELECT DISTINCT cod_policy FROM fn_policy_mast;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = TRUE;

     OPEN c1;
     OPEN c2;
     OPEN c3;
     OPEN c4;
    -- OPEN d_policy;

     read_loop: LOOP

     FETCH c3 INTO total_accrued;
     FETCH c4 INTO total_paid;
     FETCH c2 INTO pol;
     set total = 0;
    -- FETCH d_policy INTO user_pol;

     -- IF user_pol = pol then
      set total_accrued = (SELECT SUM(monthly_premium) FROM col_trans_log WHERE policy_number LIKE pol);
      set total_paid = (SELECT SUM(transaction_amount) FROM col_Trans_log WHERE policy_number LIKE pol);

      set total =  total_paid - total_accrued;     
     -- END IF;

    -- set TOTAL = (total_accrued-total_paid);
     UPDATE fn_policy_mast set balance = TOTAL WHERE policy_number like pol;


     IF fin=TRUE THEN 
        LEAVE read_loop;
     END IF;


     -- INSERT STATEMENTS HERE
    --  set total = 0;
     END LOOP;  
     select * FROM fn_policy_mast;
     close c1;
     close c2;
     CLOSE c3;
     CLOSE c4;

END//
DELIMITER ;````

Expected result to run, accepting the declares, actual experience is thaere is some form of syntax wrong, as it does not properly recognise the declare statements

This is the error message : Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

3 个答案:

答案 0 :(得分:0)

DECLARE total_paid decimal(20,2) DEFAULT '0'

这是电话吗? 您是否尝试过将默认值更改为“ 0.00”?

答案 1 :(得分:0)

对不起,我犯了一个愚蠢的错误,忘了在过程之前添加定界符,之后它才起作用。

在该过程之前简单地添加一个“定界符//”

答案 2 :(得分:0)

但是,存储过程由多个语句组成,以分号 (;) 分隔。

如果使用 MySQL 客户端程序定义包含分号字符的存储过程,则 MySQL 客户端程序不会将整个存储过程视为单个语句,而是多个语句。

因此,您必须临时重新定义分隔符,以便您可以将整个存储过程作为单个语句传递给服务器。

DELIMITER $$

CREATE PROCEDURE sp_name()
BEGIN[enter link description here][1]
  -- statements
END $$

DELIMITER ;

有关详细信息,请参阅附件 link