使用perl脚本创建mysql存储过程时面临的问题
上述函数删除存储过程xyz(如果存在),然后创建它并执行相同的操作。存储过程只有一条update语句。但是程序创建对我来说是失败的。但是,故障似乎出现在update语句中的使用perl脚本创建mysql存储过程时面临的问题,mysql,perl,stored-procedures,Mysql,Perl,Stored Procedures,上述函数删除存储过程xyz(如果存在),然后创建它并执行相同的操作。存储过程只有一条update语句。但是程序创建对我来说是失败的。但是,故障似乎出现在update语句中的A=REPLACE(A,'\\','')行中。如果我删除这一行,那么一切都很好 update语句的目的是分别从A列和B列、C列的值中删除\(反斜杠)和\(双反斜杠) 但是,如果我从$sqlStmt=qq(过程定义)复制相同的定义从上面的perl函数到一个文本文件,说xyz.txt,在mysql提示符下执行mysql>sourc
A=REPLACE(A,'\\','')
行中。如果我删除这一行,那么一切都很好
update语句的目的是分别从A列和B列、C列的值中删除\(反斜杠)和\(双反斜杠)
但是,如果我从
$sqlStmt=qq(过程定义)复制相同的定义
从上面的perl函数到一个文本文件,说xyz.txt,在mysql提示符下执行mysql>source xyz.txt
,然后它也被成功创建,我能够执行它。但是我需要从perl脚本创建过程。请帮助。qq{}
插入反斜杠转义序列<代码>\\是生成单个反斜杠的转义序列
因此:
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;
}
}
生成字符串:
qq{A=REPLACE(A, '\\', ''),}
,因此,REPLACE
的第二个参数是,代码>(单引号、逗号、空格)。这显然不是你想要的
如果使用qq{}
,则需要避开所有反斜杠:
A=REPLACE(A, '\', ''),
但最好使用不进行插值的a:
$sqlStmt = qq(
CREATE PROCEDURE xyz()
BEGIN
update myTable set
A=REPLACE(A, '\\\\', ''),
B=REPLACE(B, '\\\\\\\\', ''),
C=REPLACE(C, '\\\\\\\\', '')
where A LIKE '["[%';
commit;
END
);
$sqlStmt=qq{}
内插反斜杠转义序列<代码>\\
是生成单个反斜杠的转义序列
因此:
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;
}
}
生成字符串:
qq{A=REPLACE(A, '\\', ''),}
,因此,REPLACE
的第二个参数是,代码>(单引号、逗号、空格)。这显然不是你想要的
如果使用qq{}
,则需要避开所有反斜杠:
A=REPLACE(A, '\', ''),
但最好使用不进行插值的a:
$sqlStmt = qq(
CREATE PROCEDURE xyz()
BEGIN
update myTable set
A=REPLACE(A, '\\\\', ''),
B=REPLACE(B, '\\\\\\\\', ''),
C=REPLACE(C, '\\\\\\\\', '')
where A LIKE '["[%';
commit;
END
);
$sqlStmt=