gpt4 book ai didi

带有预选光标数据的 MySQL 过程

转载 作者:行者123 更新时间:2023-11-29 23:27:55 31 4
gpt4 key购买 nike

所以,

我在这里面临一个问题,这让我发疯,我认为这是一个愚蠢的错误,所以我不是 MySQL 的新手,但它并不像我想象的那样工作。

尝试将此语句部署到 MySQL 后,我收到此错误:

ERROR 1064 (42000): 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 'DEClARE estoque CURSOR FOR SELECT validade, ' at line 26

这是我的 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 ;

最佳答案

检查:13.6.6.2 Cursor DECLARE Syntax

...

Cursor declarations must appear before handler declarations and aftervariable and condition declarations.

...

尝试:

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 ;

关于带有预选光标数据的 MySQL 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26809622/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com