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, '\\', ''),
中,这是更新语句的一部分。如果我删除这一行,那么一切正常。
update语句的目的是分别从A列和B列的值中删除\(反斜杠)和\\(双反斜杠)。
但是,如果我将上述perl函数的$sqlStmt = qq(procedure_definition);
中的相同定义复制到文本文件xyz.txt并在我的mysql提示符上执行mysql > source xyz.txt
,那么它也会成功创建并且我能够执行它。但我需要从perl脚本创建过程。请帮忙。
答案 0 :(得分:2)
\\
插入反斜杠转义序列; qq{A=REPLACE(A, '\\', ''),}
是一个生成单个反斜杠的转义序列。
所以这个:
A=REPLACE(A, '\', ''),
生成字符串:
REPLACE
MySQL also interprets backslash escape sequences,因此',
的第二个参数是qq{}
(单引号,逗号,空格)。这显然不是你想要的。
如果使用$sqlStmt = qq(
CREATE PROCEDURE xyz()
BEGIN
update myTable set
A=REPLACE(A, '\\\\', ''),
B=REPLACE(B, '\\\\\\\\', ''),
C=REPLACE(C, '\\\\\\\\', '')
where A LIKE '["[%';
commit;
END
);
,则需要转义所有反斜杠:
$sqlStmt = <<'SQL';
CREATE PROCEDURE xyz()
BEGIN
update myTable set
A=REPLACE(A, '\\', ''),
B=REPLACE(B, '\\\\', ''),
C=REPLACE(C, '\\\\', '')
where A LIKE '["[%';
commit;
END
SQL
但最好使用here-doc,不进行插值:
{{1}}