mySQL中的存储过程出错了

时间:2015-05-08 02:02:36

标签: mysql stored-procedures

我想为mySQL服务器创建一个存储过程。

这是我的程序

CREATE PROCEDURE ClientInsertProcedure (nomClient CHAR(40), userID INT(4), tel CHAR(10), codePostal CHAR(6), noCivique CHAR(6), r CHAR(30), v CHAR(30), cred DECIMAL(6, 2))
BEGIN
INSERT INTO Entreprise(nom_entreprise, telephone, code_postal, no_civique, rue, ville, credit) VALUES(nomClient, tel, codePostal, noCivique, r, v, cred) 
    ON DUPLICATE KEY UPDATE telephone = tel, code_postal = codePostal, no_civique = noCivique, rue = r, ville = v, credit = cred
        WHERE nom_entreprise = nomClient;
END;

它一直说我在END;

附近的最后一行有错误

我已经尝试了DELIMITER //并且它没有任何改变。我也去了mySQL网站,我在那里采用了语法。我也看了Here。语法本身有什么问题,还是我做错了?

3 个答案:

答案 0 :(得分:1)

据推测,您希望更新nom_entreprise = nomClient。如果是这样,您需要在该列上使用唯一索引/约束:

create unique index idx_ClientInsertProcedure_nomClient
    on ClientInsertProcedure(nomClient);

然后,这应该有效:

CREATE PROCEDURE ClientInsertProcedure (nomClient CHAR(40), userID INT(4), tel CHAR(10), codePostal CHAR(6), noCivique CHAR(6), r CHAR(30), v CHAR(30), cred DECIMAL(6, 2))
BEGIN
    INSERT INTO Entreprise(nom_entreprise, telephone, code_postal, no_civique, rue, ville, credit)
        VALUES(nomClient, tel, codePostal, noCivique, r, v, cred) 
        ON DUPLICATE KEY UPDATE telephone = tel, code_postal = codePostal, no_civique = noCivique, rue = r, ville = v, credit = cred;
END;

作为一般建议规则,您应该使用类似v_的内容为存储过程和函数命名参数,以便您可以轻松地将它们与表中的列区分开来。

答案 1 :(得分:0)

你可以尝试移开代码,只有

                <?php if (function_exists('page_navi')) { // if expirimental feature is active ?>

                    <?php page_navi(); // use the page navi function ?>

                <?php } else { // if it is disabled, display regular wp prev & next links ?>


                    <nav class="wp-prev-next">
                        <ul class="pager">
                            <li class="previous"><?php next_posts_link(_e('&laquo; Older Entries', "wpbootstrap")) ?></li>
                            <li class="next"><?php previous_posts_link(_e('Newer Entries &raquo;', "wpbootstrap")) ?></li>
                        </ul>
                    </nav>
                <?php } ?>      

                <?php else : ?>

                <article id="post-not-found">
                    <header>
                        <h1><?php _e("Not Found", "wpbootstrap"); ?></h1>
                    </header>
                    <section class="post_content">
                        <p><?php _e("Sorry, but the requested resource was not found on this site.", "wpbootstrap"); ?></p>
                    </section>
                    <footer>
                    </footer>
                </article>
                </div> 
                <?php endif; ?>

             <!-- end #main -->

如果没有错误,则意味着您的插入有问题

答案 2 :(得分:0)

以下是我如何使用代码:

  1. 我使用了DELIMITER
  2. 正如Gordon Linoff指出的那样,我不需要WHERE声明,因为该项目已被自动选中
      

    如果是这样,您需要在该列上使用唯一索引/约束

  3.   
  4. DELIMITER后的间距非常重要

     DELIMITER //
    
    CREATE PROCEDURE sp_ClientInsert (v_nomClient CHAR(40), v_userID INT(4), v_tel CHAR(10), v_codePostal CHAR(6), v_noCivique CHAR(6), v_rue CHAR(30), v_ville CHAR(30), v_cred DECIMAL(6, 2))
    BEGIN
    INSERT INTO Entreprise(nom_entreprise, telephone, code_postal, no_civique, rue, ville, credit) VALUES(v_nomClient, v_tel, v_codePostal, v_noCivique, v_rue, v_ville, v_cred) 
        ON DUPLICATE KEY UPDATE telephone = v_tel, code_postal = v_codePostal, no_civique = v_noCivique, rue = v_rue, ville = v_ville, credit = v_cred;
    END //
    
    DELIMETER ;
    
  5. 经过一些研究后,DELIMITER关键字使代码充当单个块。在mySQL website上,它指定DELIMITER后的字符串&#34; //&#34; (不带引号)被&#34;替换;&#34; (不含引号)

      

    分隔符更改为//以使整个定义作为单个语句传递给服务器,然后恢复为;在调用该过程之前。这使得;在过程体中使用的分隔符将被传递给服务器,而不是由mysql本身解释。

    这使得一个代码块可以作为一个整体执行。

    感谢您的帮助。

    修改 以下是Yu Yenken提供的解释INSERT INTO... ON DUPLICATE KEY UPDATE的链接