通过C API更改MySQL查询分隔符

时间:2010-01-21 13:09:22

标签: c mysql

如何使用C API更改MySQL查询分隔符?我尝试发送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:使用C api的mysqlclient这样做,所以必须有办法..

3 个答案:

答案 0 :(得分:7)

只有在使用mysql客户端程序时才需要更改分隔符(因为它是 mysql ,它将分号解释为语句分隔符)。 You don't need to change the delimiter when using the C API

  

通常,您只能使用mysql_query()执行一个SQL命令。只有在语法允许的情况下,分号才会出现在这样的命令中,而通常情况并非如此!特别是,SQL不允许命令以分号结尾。 (如果您尝试这样做,C API将引发错误。)

     

命令CREATE PROCEDURECREATE FUNCTIONCREATE TRIGGER等在定义存储过程或触发器时是例外:在这些命令中,分号用作SQL指令之间的分隔符这是存储过程或触发器的一部分。这些命令可以毫无问题地执行。

P.S。您可能应该再次关闭multi statements

答案 1 :(得分:0)

您可以使用mysql_query执行多个命令。您必须在建立连接时设置一些参数。 例如。, unsigned long 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 IF EXISTS test_table; \                       CREATE TABLE test_table(id INT); \                       INSERT INTO test_table VALUES(10); \                       UPDATE test_table SET id = 20 WHERE id = 10; \                       SELECT * FROM test_table; \                       DROP TABLE test_table“);

答案 2 :(得分:-1)

你试过吗

DELIMITER //

没有“;”在末尾?可能无法在包含多个查询的查询中更改分隔符。