2016-08-27 7 views
0

Oracle PL/SQLでの経験にもかかわらず、MySQL(MariaDB)でアプリケーションを開発し始めています。MySQLのストアドプロシージャが予期したデータを書き込まない

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

この条件が正しくありません:

AND mdoc.tipo_movimento IN (p_tipoMovEntrada) 

私はp_tipoMovEntradaは、カンマ区切りの文字列で、あなたはその中の項目のいずれかに一致するようにしようとしていると仮定します。しかし、IN()のリストは、ソースのリテラルリストでなければならず、文字列引数のコンマを解析しません。実際、p_tipoMovEntradaパラメータは文字列のシーケンスである

AND FIND_IN_SET(mdoc.tipo_movimento, p_tipoMovEntrada) 
+0

こんにちはバマ、 - > '001'、 '005'、 '017'、 '050'、 '105':にそれを変更します。 FIND_IN_SETそれは問題を解決していない(mdoc.tipo_movimento、p_tipoMovEntrada)> 0 : でも、ラインを変更することです。 コメントや提案はありますか? ありがとうございます。 –

+0

文字列の引用符を取り、 'FIND_IN_SET'は' 001,005,017,050,105'のような文字列を期待します。 – Barmar

+0

Barmarさんが私の問題を完全に解決しました。 –

関連する問題