Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用perl脚本创建mysql存储过程时面临的问题_Mysql_Perl_Stored Procedures - Fatal编程技术网

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

使用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

上述函数删除存储过程xyz(如果存在),然后创建它并执行相同的操作。存储过程只有一条update语句。但是程序创建对我来说是失败的。但是,故障似乎出现在update语句中的
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=