mysql存储过程不会写入预期的数据

时间:2016-08-27 16:23:36

标签: mysql stored-procedures sql-insert

尽管我有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

1 个答案:

答案 0 :(得分:0)

这种情况不正确:

AND mdoc.tipo_movimento IN (p_tipoMovEntrada)

我假设p_tipoMovEntrada是逗号分隔的字符串,并且您正在尝试匹配其中的任何项目。但是IN()中的列表必须是源代码中的文字列表,它不会解析字符串参数中的逗号。将其更改为:

AND FIND_IN_SET(mdoc.tipo_movimento, p_tipoMovEntrada)