这个MySQL查询有什么问题吗?
我是第一次编写存储过程,但它不起作用。问题是我看不出它不起作用的理由 我正在通过phpMyAdmin2.8.2.4运行它。我的MySQL版本是5.1。以下是查询的第一部分:这个MySQL查询有什么问题吗?,sql,mysql,syntax,Sql,Mysql,Syntax,我是第一次编写存储过程,但它不起作用。问题是我看不出它不起作用的理由 我正在通过phpMyAdmin2.8.2.4运行它。我的MySQL版本是5.1。以下是查询的第一部分: create procedure under_user_type (in original_post int, out user_type int, out user_id longtext) begin if exists ( select * from wp_postmet
create procedure under_user_type (in original_post int, out user_type int, out user_id longtext)
begin
if exists (
select *
from wp_postmeta as pm
where pm.post_id = original_post
and pm.meta_key = '_tdomf_original_poster_id'
) then
set user_type = 0;
select pm.meta_value
into user_id
from wp_postmeta as pm
where pm.post_id = original_post
and pm.meta_key = '_tdomf_original_poster_id';
elseif exists ( ...
我得到一个错误:
1064-您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第9行附近要使用的正确语法
第9行对应于if exists。。。然后是一份
更新:
如果我使用以下命令,则会出现相同的错误:
create procedure under_user_type (in original_post int, out user_type int, out user_id longtext)
begin
if 1=1 then begin
set user_type = 0;
select pm.meta_value
into user_id
from wp_postmeta as pm
where pm.post_id = original_post
and pm.meta_key = '_tdomf_original_poster_id';
end;
再次更新:
在上运行示例还可以检查语法是否接近错误。我尝试从查询中删除所有选项卡,但没有任何效果
第三次更新:
我可以运行此查询:
create procedure blah()
begin
end;
create procedure blah2()
begin
if 1=1 then
begin
end;
end if;
end;
但不是这个问题:
create procedure blah()
begin
end;
create procedure blah2()
begin
if 1=1 then
begin
end;
end if;
end;
因为我得到了同样的错误。如果MySQL存在,我认为它无法处理。 你可以试试
declare testMe integer default (select ID from ... where ...);
if testMe is not NULL then
...
以下是我的作品:
create procedure blah2()
begin
declare s int;
if exists(select 1) then
set s=1;
end if;
end;
我认为在第一个示例中,在您尝试进行所有实验之前,您的问题是您没有声明变量user_类型,因此MySQL在遇到一个在第9行中从未见过的变量名时,会打印出一个非常通用的错误
至于你所有的其他例子,你不应该这样做,如果。。。然后开始。。。终止正确的语法是如果。。。然后如果。。。其他的如果在第9行遇到第一个分号时出现错误,则结束 如果要在过程主体内使用分号,则需要将分隔符设置为分号以外的其他值 以下是如何为您的最简单示例执行此操作:
DELIMITER $$
create procedure blah2()
begin
if 1=1 then
begin
end;
end if;
end $$
DELIMITER ;
问题是PHPMyAdmin每次看到分号时都必须尝试将查询本身拆分。这就是MySQL CLI所做的,这就是为什么在命令行上创建存储过程时需要更改分隔符的原因。但是,我的PHPMyAdmin 2.8.2.4版本不允许我更改分隔符,因此我只得到了一堆无用的错误消息 最后,我在远程服务器上编写了一个脚本,其中包含一个textarea和submit按钮,该按钮将textarea的内容传递给mysqli::multi_查询。此函数允许mysql处理分隔符,而不是试图将其本身拆分,因此创建过程在这方面起作用
另一个更简单的方法是使用MySQL Workbench连接到数据库,如果数据库只允许来自本地主机的连接,则可能通过ssh进行连接。尝试在if和else块周围放置begin/end语句?捕捉得很好,但我仍然得到相同的错误-解析器似乎卡在了该exists表达式中,而没有访问其余的语句,但我的过程似乎失败了,即使我写的是if 1=1。是否可能PHPMyAdmin对查询做了一些可笑的事情,或者以不支持创建过程的方式执行查询?您可能还需要分隔符//begin。。。结束//而不是结束;同样对于过程blah2,您需要在end之前加一个end,如果我在PHP错误报告中读到有人报告说delimiter在PHP中不起作用,那么只需要从命令行更改delimiter,这样它就知道何时开始执行语句。报告说MySQL在从创建存储过程时不需要更改分隔符PHP@Darcara是的,很抱歉我在那个愚蠢的例子中犯了很多错误哈哈。不幸的是,我尝试运行的实际查询是以这种方式正确的,即使使用更正的blah2示例,它仍然不会执行。没问题。有趣的是,如果我在最后添加//并在查询正下方的文本字段中将phpMyAdmin中的分隔符设置为//的话,您的blah2过程就可以运行了。您是如何执行此查询的?不幸的是,我得到了我一直得到的同样的错误。也许只是phpMyAdmin?另外,如果在if/elseif/else块中有多个语句,是否不需要开始和结束?啊,原来问题是PHPMyAdmin。我编写了一个服务器端PHP脚本,用户可以使用mysqli,我的过程运行良好。然后,我在PHPMyAdmin中对其进行了测试,并收到了我想要的结果。@Carson,当您在CLI中安装过程时,您必须将语句分隔符更改为除;这样CLI在遇到分号时不会拆分语句本身。因此,中的过程定义前面的分隔符//。但如果这是您的问题,您的错误消息不会抱怨第9行。我使用php的mysqli::multi_query-phpmyadmin在不更改分隔符的情况下使查询正常工作。第9行实际上是select语句的开头,我在发布代码之前省略了五行。此外,我没有通过命令行运行此查询,这是需要更改分隔符的地方-事实上,我相信分隔符命令是特定于命令行解释器的。PHPMyAdmin必须做什么 与CLI类似,但我的版本不允许更改分隔符。最后我编写了一个脚本来执行代码,它在没有分隔符的情况下工作。