Что-то не так с этим запросом MySQL? - PullRequest
0 голосов
/ 18 августа 2010

Я пишу хранимые процедуры впервые, и это не работает. Проблема в том, что я не вижу причин, по которым это не работает.

Я запускаю его через phpmyadmin 2.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 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 9

Строка 9 соответствует первому оператору выбора в части if exists ( ... ) then.

Обновление:

Я получаю ту же ошибку, если использую:

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;

Обновите снова:

Выполнение примеров на на этой странице документации MySQL также дает мне сообщение об ошибке "проверьте ваш синтаксис рядом с '". Я попытался удалить все вкладки из запроса, но ничего не получилось.

Обновление в третий раз:

Я могу выполнить этот запрос:

create procedure blah()
begin
end;

но не этот запрос:

create procedure blah2()
begin
   if 1=1 then
   begin
   end;
   end if;
end;

как я получаю ту же ошибку.

Ответы [ 4 ]

1 голос
/ 18 августа 2010

Для меня работает следующее:

create procedure blah2()
begin
  declare s int;
  if exists(select 1) then
    set s=1;
  end if;
end;

Я думаю, что ваша проблема (в самом первом примере, прежде чем вы попытаетесь выполнить все свои эксперименты) состоит в том, что вы не объявили переменную user_typeТаким образом, MySQL печатает (очень общую) ошибку, когда встречает имя переменной, которое никогда не встречалось в строке 9.

(Как и во всех других ваших примерах, вы не должны do if ... then begin ... end; Правильный синтаксис: if ... then ... elseif ... else ... end if)

0 голосов
/ 18 августа 2010

Проблема в том, что PHPMyAdmin должен пытаться разделять запросы каждый раз, когда видит точку с запятой. Это то, что делает MySQL CLI, поэтому необходимо изменить разделитель при создании хранимой процедуры в командной строке. Однако моя версия PHPMyAdmin (2.8.2.4) не позволяет мне изменять разделитель, поэтому я просто завел кучу бесполезных сообщений об ошибках.

Я закончил написание скрипта на удаленном сервере с текстовой областью и отправил кнопку, которая передала бы содержимое текстовой области на mysqli::multi_query. Эта функция позволяет mysql обрабатывать разделители, а не пытаться разделить их самостоятельно, поэтому создание процедуры сработало в этом отношении.

Другой, более простой способ - использовать MySQL Workbench для подключения к базе данных, возможно, через ssh, если база данных разрешает соединения только с localhost.

0 голосов
/ 18 августа 2010

Ошибка в строке 9, когда встречается первая точка с запятой.

Вам нужно установить DELIMITER на что-то отличное от точки с запятой, если вы собираетесь использовать точки с запятой внутритело вашей процедуры.

Вот как это сделать для вашего простейшего примера:

DELIMITER $$

create procedure blah2()
begin
   if 1=1 then
   begin
   end;
   end if;
end $$

DELIMITER ;
0 голосов
/ 18 августа 2010

Я не думаю, что MySQL может обрабатывать «если существует». Вы можете попробовать

declare testMe integer default (select ID from ... where ...);

if testMe is not NULL then
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...