尽管我有Oracle PL / SQL的经验,但我开始在MySQL(MariaDB)上开发一个应用程序,我刚开始编写的一个简单程序没有按预期工作。
虽然执行DELETE和TRUNCATE语句,但INSERT语句在调用过程时不会产生任何结果。
我犯了一个错误?数据库中是否有任何阻止INSERT的参数?如果您手动运行INSERT,一切正常。
提前感激。
CREATE DEFINER = 'root'@'192.168.0.%'
PROCEDURE invent.InicializaInventario(IN p_empresa varchar(4),
IN p_competencia varchar(6),
IN p_tipoMovEntrada varchar(255),
IN p_tipoMovSaida varchar(255),
IN p_dataInicial VARCHAR(10),
IN p_dataFinal VARCHAR(10))
MODIFIES SQL DATA
BEGIN
/*
+---------------------------------------------------------------------------+
| Fase 1 |
+---------------------------------------------------------------------------+
| - Limpa registros de inventário existentes de processamentos anteriores |
| - Limpa tabela temporária de produtos |
| - Limpa tabela temporária de movimentos |
+---------------------------------------------------------------------------+
*/
DELETE
FROM inventario
WHERE codigo_empresa = p_empresa
AND competencia = p_competencia;
TRUNCATE TABLE movfiscal;
TRUNCATE TABLE prodfiscal;
/*
+---------------------------------------------------------------------------+
| Fase 2 |
+---------------------------------------------------------------------------+
| - povoa a tabela temporária de movimentos |
+---------------------------------------------------------------------------+
*/
INSERT INTO movfiscal
(codigo_empresa,
data_movimento,
codigo_produto,
tipo_movimento,
codigo_deposito,
numero_documento,
sequencia,
descricao_produto,
quantidade,
unidade_medida_produto,
qtde_nota,
unidade_medida_nota,
classificacao_fiscal,
cst,
origem_mercadoria,
situacao_tributaria,
preco_unitario,
e_s)
SELECT mdoc.codigo_empresa,
mdoc.data_movimento,
mdoc.codigo_produto,
mdoc.tipo_movimento,
mdoc.codigo_deposito,
mdoc.numero_documento,
mdoc.sequencia,
mdoc.descricao_produto,
mdoc.quantidade,
mdoc.unidade_medida_produto,
mdoc.qtde_nota,
mdoc.unidade_medida_nota,
mdoc.classificacao_fiscal,
mdoc.cst,
mdoc.origem_mercadoria,
mdoc.situacao_tributaria,
mdoc.preco_unitario,
mdoc.e_s
FROM mdoc
WHERE mdoc.codigo_empresa = p_empresa
AND mdoc.data_movimento >= p_dataInicial
AND mdoc.data_movimento <= p_dataFinal
AND mdoc.codigo_produto IS NOT NULL
AND mdoc.codigo_produto <> ''
AND mdoc.tipo_movimento IN (p_tipoMovEntrada)
ORDER BY mdoc.data_movimento,
mdoc.codigo_produto,
mdoc.tipo_movimento,
mdoc.codigo_deposito,
mdoc.numero_documento,
mdoc.sequencia;
END
答案 0 :(得分:0)
这种情况不正确:
AND mdoc.tipo_movimento IN (p_tipoMovEntrada)
我假设p_tipoMovEntrada
是逗号分隔的字符串,并且您正在尝试匹配其中的任何项目。但是IN()
中的列表必须是源代码中的文字列表,它不会解析字符串参数中的逗号。将其更改为:
AND FIND_IN_SET(mdoc.tipo_movimento, p_tipoMovEntrada)