我想为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。语法本身有什么问题,还是我做错了?
答案 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('« Older Entries', "wpbootstrap")) ?></li>
<li class="next"><?php previous_posts_link(_e('Newer Entries »', "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)
以下是我如何使用代码:
DELIMITER
WHERE
声明,因为该项目已被自动选中
如果是这样,您需要在该列上使用唯一索引/约束
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 ;
经过一些研究后,DELIMITER
关键字使代码充当单个块。在mySQL website上,它指定DELIMITER
后的字符串&#34; //&#34; (不带引号)被&#34;替换;&#34; (不含引号)
分隔符更改为//以使整个定义作为单个语句传递给服务器,然后恢复为;在调用该过程之前。这使得;在过程体中使用的分隔符将被传递给服务器,而不是由mysql本身解释。
这使得一个代码块可以作为一个整体执行。
感谢您的帮助。
修改强> 以下是Yu Yenken提供的解释INSERT INTO... ON DUPLICATE KEY UPDATE的链接