2014-11-07 1 views
0

그래서, 그 날 미친 makeing되고, 여기에 문제에 직면하고있다MySQL의 절차

,이 바보 같은 오류라고 생각합니다, 그래서 MySQL을하지만하지의 초보자 아니다 내 생각처럼 일하고있어.

ERROR 1064 (42000) : : 시도 후

내가이 에로있어 MySQL의이 한 Statment를 배포하는 당신은 당신의 SQL 구문에 오류가 있습니다; 근처 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인 라인 여기에 26

에서 ' validade를 SELECT를 들어, 을 estoque 커서를 선언하는 것은'내 SP

DROP PROCEDURE IF EXISTS SP_SEPARA_MATERIAL; 
DELIMITER $$ 
CREATE PROCEDURE SP_SEPARA_MATERIAL(IN MovimentoItemPedidoID INT(11)) 
BEGIN 
    DECLARE EMPRESA_ID int; 
    DECLARE MOVIMENTO_ID int; 
    DECLARE ARMAZEM_ID int; 
    DECLARE CLIENTE_ID int; 
    DECLARE FLUXO_LOGISTICO_ID int; 
    DECLARE PRODUTO_ID int; 
    DECLARE VOLUME_ID int; 
    DECLARE VALIDADE date; 
    DECLARE LOTE int; 
    DECLARE NOTA int; 
    DECLARE PRECO double; 
    DECLARE QTD_BOM double; 
    DECLARE QTD_RUIM double; 
    DECLARE ESTOQUE_BOM double; 
    DECLARE ESTOQUE_RUIM double; 
    DECLARE RET_BOM double; 
    DECLARE RET_RUIM double; 
    DECLARE finished INTEGER DEFAULT 0; 

    -- Catch head data of move 
    SELECT movimento_id, fluxo_logistico_id, produto_id, quantidade_bom, quantidade_ruim INTO MOVIMENTO_ID, FLUXO_LOGISTICO_ID, PRODUTO_ID, QTD_BOM, QTD_RUIM FROM movimento_itens_pedido WHERE id = MovimentoItemPedidoID; 
    SELECT empresa_id, cliente_id, armazem_id INTO EMPRESA_ID, CLIENTE_ID, ARMAZEM_ID FROM movimento WHERE id = MOVIMENTO_ID; 

    DEClARE estoque CURSOR FOR 
     SELECT 
      validade, 
      lote_numero, 
      nota_numero, 
      preco_unitario, 
      volume_id, 
      quantidade_bom, 
      quantidade_ruim 
     FROM 
      estoque_enderecado_reserva_picking 
     WHERE 
      empresa_id = EMPRESA_ID AND 
      armazem_id = ARMAZEM_ID AND 
      cliente_id = CLIENTE_ID AND 
      produto_id = PRODUTO_ID AND 
      (quantidade_bom>=0 OR quantidade_ruim>=0); 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 

    OPEN estoque; 
    loop_separacao: LOOP 
     FETCH estoque INTO 
      VALIDADE, 
      LOTE, 
      NOTA, 
      PRECO, 
      VOLUME_ID, 
      ESTOQUE_BOM, 
      ESTOQUE_RUIM; 

     IF finished = 1 THEN 
      LEAVE loop_separacao; 
     END IF; 

     IF QTD_BOM>0 AND ESTOQUE_BOM>0 THEN 
      SET RET_BOM = 0; 
      IF ESTOQUE_BOM>=QTD_BOM THEN 
       SET RET_BOM = QTD_BOM; 
      ELSE 
       SET RET_BOM = ESTOQUE_BOM; 
      END IF; 
     END IF; 

     IF QTD_RUIM>0 AND ESTOQUE_RUIM>0 THEN 
      SET RET_RUIM = 0; 
      IF ESTOQUE_RUIM>=QTD_RUIM THEN 
       SET RET_RUIM = QTD_RUIM; 
      ELSE 
       SET RET_RUIM = ESTOQUE_RUIM; 
      END IF; 
     END IF; 

     IF RET_BOM>0 OR RET_RUIM>0 THEN 
      INSERT INTO movimento_picking_volume_itens (movimento_id,armazem_id,cliente_id,fluxo_logistico_id,produto_id,quantidade_bom,quantidade_ruim,validade,lote_numero,nota_numero,preco_unitario,volume_id) 
      VALUES (MOVIMENTO_ID,ARMAZEM_ID,CLIENTE_ID,FLUXO_LOGISTICO_ID,PRODUTO_ID,RET_BOM,RET_RUIM,VALIDADE,LOTE,NOTA,PRECO,VOLUME_ID); 
      SET QTD_BOM = (QTD_BOM - RET_BOM); 
      SET QTD_RUIM = (QTD_RUIM - RET_RUIM); 
     END IF; 

     IF QTD_BOM=0 AND QTD_RUIM=0 THEN 
      SET finished = 1; 
      LEAVE loop_separacao; 
     END IF; 

    END LOOP loop_separacao; 
    CLOSE estoque; 

END $$ 
DELIMITER ; 

답변

0

확인하다 : 13.6.6.2 Cursor DECLARE Syntax

...

커서 선언은 핸들러 선언 전에 나타나야하고 변수 및 조건 선언 뒤에 나타나야합니다.

...

시도 :

DROP PROCEDURE IF EXISTS SP_SEPARA_MATERIAL; 

DELIMITER $$ 

CREATE PROCEDURE SP_SEPARA_MATERIAL(IN MovimentoItemPedidoID INT(11)) 
BEGIN 
    DECLARE EMPRESA_ID int; 
    DECLARE MOVIMENTO_ID int; 
    DECLARE ARMAZEM_ID int; 
    DECLARE CLIENTE_ID int; 
    DECLARE FLUXO_LOGISTICO_ID int; 
    DECLARE PRODUTO_ID int; 
    DECLARE VOLUME_ID int; 
    DECLARE VALIDADE date; 
    DECLARE LOTE int; 
    DECLARE NOTA int; 
    DECLARE PRECO double; 
    DECLARE QTD_BOM double; 
    DECLARE QTD_RUIM double; 
    DECLARE ESTOQUE_BOM double; 
    DECLARE ESTOQUE_RUIM double; 
    DECLARE RET_BOM double; 
    DECLARE RET_RUIM double; 
    DECLARE finished INTEGER DEFAULT 0; 

    /* MOVE AFTER THE DECLARE CONTINUE HANDLER ... 
    -- Catch head data of move 
    SELECT movimento_id, fluxo_logistico_id, produto_id, quantidade_bom, quantidade_ruim INTO MOVIMENTO_ID, FLUXO_LOGISTICO_ID, PRODUTO_ID, QTD_BOM, QTD_RUIM FROM movimento_itens_pedido WHERE id = MovimentoItemPedidoID; 
    SELECT empresa_id, cliente_id, armazem_id INTO EMPRESA_ID, CLIENTE_ID, ARMAZEM_ID FROM movimento WHERE id = MOVIMENTO_ID; 
    MOVE AFTER THE DECLARE CONTINUE HANDLER ... */ 

    DEClARE estoque CURSOR FOR 
     SELECT 
      validade, 
      lote_numero, 
      nota_numero, 
      preco_unitario, 
      volume_id, 
      quantidade_bom, 
      quantidade_ruim 
     FROM 
      estoque_enderecado_reserva_picking 
     WHERE 
      empresa_id = EMPRESA_ID AND 
      armazem_id = ARMAZEM_ID AND 
      cliente_id = CLIENTE_ID AND 
      produto_id = PRODUTO_ID AND 
      (quantidade_bom>=0 OR quantidade_ruim>=0); 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; 

    -- Catch head data of move 
    SELECT movimento_id, fluxo_logistico_id, produto_id, quantidade_bom, quantidade_ruim INTO MOVIMENTO_ID, FLUXO_LOGISTICO_ID, PRODUTO_ID, QTD_BOM, QTD_RUIM FROM movimento_itens_pedido WHERE id = MovimentoItemPedidoID; 
    SELECT empresa_id, cliente_id, armazem_id INTO EMPRESA_ID, CLIENTE_ID, ARMAZEM_ID FROM movimento WHERE id = MOVIMENTO_ID; 

    OPEN estoque; 
    loop_separacao: LOOP 
     FETCH estoque INTO 
      VALIDADE, 
      LOTE, 
      NOTA, 
      PRECO, 
      VOLUME_ID, 
      ESTOQUE_BOM, 
      ESTOQUE_RUIM; 

     IF finished = 1 THEN 
      LEAVE loop_separacao; 
     END IF; 

     IF QTD_BOM>0 AND ESTOQUE_BOM>0 THEN 
      SET RET_BOM = 0; 
      IF ESTOQUE_BOM>=QTD_BOM THEN 
       SET RET_BOM = QTD_BOM; 
      ELSE 
       SET RET_BOM = ESTOQUE_BOM; 
      END IF; 
     END IF; 

     IF QTD_RUIM>0 AND ESTOQUE_RUIM>0 THEN 
      SET RET_RUIM = 0; 
      IF ESTOQUE_RUIM>=QTD_RUIM THEN 
       SET RET_RUIM = QTD_RUIM; 
      ELSE 
       SET RET_RUIM = ESTOQUE_RUIM; 
      END IF; 
     END IF; 

     IF RET_BOM>0 OR RET_RUIM>0 THEN 
      INSERT INTO movimento_picking_volume_itens (movimento_id,armazem_id,cliente_id,fluxo_logistico_id,produto_id,quantidade_bom,quantidade_ruim,validade,lote_numero,nota_numero,preco_unitario,volume_id) 
      VALUES (MOVIMENTO_ID,ARMAZEM_ID,CLIENTE_ID,FLUXO_LOGISTICO_ID,PRODUTO_ID,RET_BOM,RET_RUIM,VALIDADE,LOTE,NOTA,PRECO,VOLUME_ID); 
      SET QTD_BOM = (QTD_BOM - RET_BOM); 
      SET QTD_RUIM = (QTD_RUIM - RET_RUIM); 
     END IF; 

     IF QTD_BOM=0 AND QTD_RUIM=0 THEN 
      SET finished = 1; 
      LEAVE loop_separacao; 
     END IF; 

    END LOOP loop_separacao; 
    CLOSE estoque; 

END $$ 

DELIMITER ; 
+0

감사 남자! 이것은 매력처럼 작동했습니다! –