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,然后创建它并执行相同的存储过程。存储过程只有一条update语句。但对我来说,程序的创建失败了。但是,错误似乎发生在行A=REPLACE(A, '\\', ''),中,它是update语句的一部分。如果我删除这一行,那么一切都正常。
update语句的目的是分别从列A和B、C的值中删除(反斜杠)和\(双反斜杠)。
但是,如果我从上面的perl函数将相同的定义从$sqlStmt = qq(procedure_definition);复制到文本文件,比如xyz.txt,并在mysql提示符上执行mysql > source xyz.txt,那么它也会被成功创建,并且我能够执行它。但是我需要从perl脚本创建这个过程。请帮帮忙。
发布于 2016-03-29 14:29:32
qq{}内插反斜杠转义序列;\\是生成单个反斜杠的转义序列。
所以这个:
qq{A=REPLACE(A, '\\', ''),}生成字符串:
A=REPLACE(A, '\', ''),MySQL还解释反斜杠转义序列。,所以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
);但是最好使用这里-医生,它不进行插值:
$sqlStmt = <<'SQL';
CREATE PROCEDURE xyz()
BEGIN
update myTable set
A=REPLACE(A, '\\', ''),
B=REPLACE(B, '\\\\', ''),
C=REPLACE(C, '\\\\', '')
where A LIKE '["[%';
commit;
END
SQLhttps://stackoverflow.com/questions/36281627
复制相似问题