gpt4 book ai didi

mysql - 使用perl脚本创建mysql存储过程时遇到问题

转载 作者:行者123 更新时间:2023-11-29 07:20:36 26 4
gpt4 key购买 nike

sub callSP()
{
my $db_handle = new MP::ATCA::SQLExec(
MYSQL_DB,
MYSQL_PORT,
AUTO_COMMIT
);
if (!defined($db_handle))
{
# Connection/Validation error
return 1;
}

my $sqlStmt = qq(DROP PROCEDURE IF EXISTS xyz);
my $errStr = $db_handle->Execute($sqlStmt);
if ($errStr ne "")
{
print("DROP PROCEDURE failed\n");
return 0;
}

$sqlStmt = qq(CREATE PROCEDURE xyz()
BEGIN

update myTable set
A=REPLACE(A, '\\', ''),
B=REPLACE(B, '\\\\', ''),
C=REPLACE(C, '\\\\', '')
where A LIKE '["[%';

commit;
END);
print $sqlStmt . "\n";
$errStr = $db_handle->Execute($sqlStmt);
if ($errStr ne "")
{
print("CREATE PROCEDURE failed\n");
return 0;
}

$sqlStmt = "CALL xyz()";
$errStr = $db_handle->Execute($sqlStmt);
if ($errStr ne "")
{
print("EXECUTE PROCEDURE failed\n");
return 0;
}
}

上面的函数删除存储过程 xyz(如果存在),然后创建它并执行相同的操作。存储过程只有一条更新语句。但程序创建对我来说失败了。然而,错误似乎出在行 A=REPLACE(A, '\\', ''), 中,它是更新语句的一部分。如果我删除这条线那么一切都会正常。

更新语句的目的是分别从 A 列和 B、C 列的值中删除\(反斜杠) 和\\(双反斜杠)。

但是,如果我将上述 perl 函数中的 $sqlStmt = qq(procedure_definition); 中的相同定义复制到文本文件 xyz.txt 并执行 mysql > source xyz .txt 在我的 mysql 提示符上,然后它也成功创建并且我能够执行它。但我需要从 perl 脚本创建过程。请帮忙。

最佳答案

qq{} 插入反斜杠转义序列; \\ 是生成单个反斜杠的转义序列。

所以这个:

qq{A=REPLACE(A, '\\', ''),}

生成字符串:

A=REPLACE(A, '\', ''),

MySQL also interprets backslash escape sequences ,因此 REPLACE 的第二个参数是 ', ​ (单引号、逗号、空格)。这显然不是你想要的。

<小时/>

如果使用qq{},则需要转义所有反斜杠:

$sqlStmt = qq(
CREATE PROCEDURE xyz()
BEGIN

update myTable set
A=REPLACE(A, '\\\\', ''),
B=REPLACE(B, '\\\\\\\\', ''),
C=REPLACE(C, '\\\\\\\\', '')
where A LIKE '["[%';

commit;
END
);

但最好使用 here-doc ,不进行插值:

$sqlStmt = <<'SQL';
CREATE PROCEDURE xyz()
BEGIN

update myTable set
A=REPLACE(A, '\\', ''),
B=REPLACE(B, '\\\\', ''),
C=REPLACE(C, '\\\\', '')
where A LIKE '["[%';

commit;
END
SQL

关于mysql - 使用perl脚本创建mysql存储过程时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36281627/

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