gpt4 book ai didi

mysql - Perl、DBI 和 MySQL 定界符

转载 作者:可可西里 更新时间:2023-11-01 06:45:01 27 4
gpt4 key购买 nike

我需要能够通过 DBI 发出“创建触发器”。我似乎无法使分隔符命令正常工作。任何人都可以找到一种方法来完成这项工作吗?

代码:

use strict;
use DBI;
my $dbargs = {mysql_auto_reconnect => 1,
AutoCommit => 0,
RaiseError => 1,
ShowErrorStatement => 1};

my $dsn = "DBI:mysql:database=xdisp;host=cycldev06";
my $dbh = DBI->connect( $dsn, 'sqluser', '', $dbargs);

my $sql = qq{
DELIMITER //
CREATE TRIGGER `hardware_last_status` BEFORE UPDATE
ON `hardware` FOR EACH ROW BEGIN
IF NEW.status != OLD.status AND NEW.last_status = OLD.last_status THEN
SET NEW.last_status = OLD.status;
END IF;
END
//
};

$dbh->do($sql);

结果:

DBD::mysql::db do failed: 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 'DELIMITER // 
CREATE TRIGGER `hardware_last_status` BEFORE UPDATE
' at line 1 at test.pl line 24.

并且该 SQL 在 MySQL 命令行中运行良好。

最佳答案

客户端程序使用delimiter 命令来确定SQL 语句的限制。服务器本身(几乎可以肯定)看不到它。因此,在 Perl + DBI 中,您应该简单地省略定界符。因此,您应该执行的命令是:

my $sql = qq{ 
CREATE TRIGGER `hardware_last_status` BEFORE UPDATE
ON `hardware` FOR EACH ROW BEGIN
IF NEW.status != OLD.status AND NEW.last_status = OLD.last_status THEN
SET NEW.last_status = OLD.status;
END IF;
END
};

关于mysql - Perl、DBI 和 MySQL 定界符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12417076/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com