这个MySQL查询有什么问题吗?

这个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

我是第一次编写存储过程,但它不起作用。问题是我看不出它不起作用的理由

我正在通过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_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类似,但我的版本不允许更改分隔符。最后我编写了一个脚本来执行代码,它在没有分隔符的情况下工作。