2016-03-29 13 views
0
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が存在する場合は削除し、それを作成して実行します。ストアドプロシージャには更新ステートメントが1つしかありません。しかし、プロシージャの作成は私のために失敗しています。しかし、エラーは、更新ステートメントの一部であるA=REPLACE(A, '\\', ''),行にあるようです。この行を削除すると、すべて正常に動作します。perlスクリプトを使用してmysqlストアドプロシージャを作成する際に直面する問題

更新ステートメントの目的は、\(バックスラッシュ)と\\(ダブルバックスラッシュ)をそれぞれ列AとB、Cの値から削除することです。

しかし、上記のperl関数から同じ定義を上記のperl関数からxyz.txtというテキストファイルにコピーしてmysqlプロンプトでmysql > source xyz.txtを実行すると、正常に作成されて実行できます。しかし、私はperlスクリプトから手続きを作成する必要があります。助けてください。

答えて

2

qq{}は、バックスラッシュエスケープシーケンスを内挿します。 \\は、単一のバックスラッシュを生成するエスケープシーケンスです。

ので、この:

A=REPLACE(A, '\', ''), 

MySQL also interprets backslash escape sequences、そうREPLACEの二番目の引数は、', ​(単一引用符、カンマ、スペース)である:

qq{A=REPLACE(A, '\\', ''),} 

は、文字列を生成します。これは明らかにあなたが望むものではありません。

$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を、使用することを

$sqlStmt = qq(
    CREATE PROCEDURE xyz() 
    BEGIN 

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

    commit; 
    END 
); 

しかし、それは良いでしょう:あなたはqq{}を使用している場合


、あなたはすべてのバックスラッシュをエスケープする必要があります

関連する問題