Изменение разделителя запросов MySQL через C API - PullRequest
1 голос
/ 21 января 2010

Как я могу изменить разделитель запросов MySQL, используя C API? Я пытался отправить DELIMITER | как запрос, пожаловался на ..the right syntax to use near 'delimiter' at line 1 ..

Пробовал DELIMITER |; тоже не повезло. Пробовал DELIMITER |; SELECT 1|, не повезло. (

Причина, по которой я спрашиваю, заключается в том, что мне нужно создать триггер через C API, например:

create trigger increase_count after insert on torrent_clients for each row
begin
   IF NEW.BytesLeft = 0 THEN
      UPDATE torrents SET Seeders = Seeders + 1 WHERE torrents.InfoHash = NEW.InfoHash;
   ELSE
      UPDATE torrents SET Leechers = Leechers + 1 WHERE torrents.InfoHash = NEW.InfoHash;
   END IF;
end|

но я не думаю, что есть способ сделать это без изменения разделителя, не так ли?

Спасибо!


РЕДАКТИРОВАТЬ: обратите внимание, что мне нужно явно написать разделитель в конце, так как я выполняю несколько запросов только с одним вызовом API (у меня есть несколько операторов)


EDIT2: mysqlclient, который использует C api, делает это, поэтому должен быть способ ..

Ответы [ 3 ]

7 голосов
/ 25 января 2010

Изменение разделителя необходимо только при использовании клиентской программы mysql (потому что именно mysql интерпретирует точку с запятой как разделитель операторов). Вам не нужно менять разделитель при использовании C API :

Обычно вы можете выполнить только одну команду SQL с mysql_query(). Точка с запятой может появляться в такой команде только в том случае, если она синтаксически разрешена, а обычно это не так! В частности, SQL не позволяет команде заканчиваться точкой с запятой. (C API выдает ошибку, если вы попытаетесь это сделать.)

Команды CREATE PROCEDURE, CREATE FUNCTION, CREATE TRIGGER и тому подобное являются исключениями, когда они определяют хранимую процедуру или триггер: в таких командах точка с запятой служит разделителем между инструкциями SQL, которые являются частью хранимой процедура или триггер. Такие команды могут быть выполнены без проблем.

P.S. Вы, вероятно, должны снова отключить multi операторов .

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

Вы можете выполнить несколько команд, используя mysql_query. Вы должны будете установить некоторые параметры, хотя при установлении соединения. например., длинные без знака opt_flags = CLIENT_FOUND_ROWS | CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS;

if (0 == mysql_real_connect (mConn, mHostName, mUserName, mUserPass, mDbName, mPort, 0, opt_flags)) ...

/ * выполнить несколько операторов * / status = mysql_query (mysql, "DROP TABLE ЕСЛИ СУЩЕСТВУЕТ test_table; \ CREATE TABLE test_table (id INT); \ INSERT INTO test_table VALUES (10); \ ОБНОВЛЕНИЕ test_table SET id = 20 ГДЕ id = 10; \ SELECT * FROM test_table; \ DROP TABLE test_table ");

0 голосов
/ 21 января 2010

Вы пробовали

DELIMITER //

без ";" в конце? Может быть невозможно изменить разделитель в запросе, который содержит несколько запросов.

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