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

时间:2016-03-29 10:25:02

标签: mysql perl stored-procedures

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脚本创建过程。请帮忙。

1 个答案:

答案 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}}