首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl脚本创建mysql存储过程时面临的问题

问使用perl脚本创建mysql存储过程时面临的问题
EN

Stack Overflow用户
提问于 2016-03-29 10:25:02
回答 1查看 67关注 0票数 0
代码语言:javascript
复制
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脚本创建这个过程。请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-29 14:29:32

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

所以这个:

代码语言:javascript
复制
qq{A=REPLACE(A, '\\', ''),}

生成字符串:

代码语言:javascript
复制
A=REPLACE(A, '\', ''),

MySQL还解释反斜杠转义序列。,所以REPLACE的第二个参数是', ​ (单引号、逗号、空格)。这显然不是你想要的。

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

代码语言:javascript
复制
$sqlStmt = qq(
    CREATE PROCEDURE xyz()
    BEGIN

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

    commit;
    END
);

但是最好使用这里-医生,它不进行插值:

代码语言:javascript
复制
$sqlStmt = <<'SQL';
    CREATE PROCEDURE xyz()
    BEGIN

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

    commit;
    END
SQL
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36281627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档