2011-09-27 2 views
0

여기에 펄과 3 개의 변수가 있습니다. 하나의 db.sql 파일을 SQL 쿼리 라인에 입력 한 다음 동일한 perl 파일에서 db.sql 파일을 실행하면됩니다. 그 변수를 가져 오지 않습니다.펄 스크립트에서 sql 파일에 perl 변수를 전달하는 방법은 무엇입니까?

$patch_name="CS2.001_PROD_TEST_37987_spyy"; 
$svn_url="$/S/B"; 
$ftp_loc="/Releases/pkumar"; 
open(SQL, "$sqlfile") or die("Can't open file $sqlFile for reading"); 
while ($sqlStatement = <SQL>) 
{ 
    $sth = $dbh->prepare($sqlStatement) or die qq("Can't prepare $sqlStatement"); 

    $sth->execute() or die ("Can't execute $sqlStatement"); 
} 
close SQL; 
$dbh->disconnect; 

다음은 내가 한 번 더 하나 개 삽입 쿼리를 실행할 수 있도록 내가 변수를 전달할 수있는 방법을

insert into branch_build_info(patch_name,branch_name,ftp_path) 
values('$patch_name','$svn_url','$ftp_loc/$patch_name.tar.gz'); 

pls는 저를 도와 db.sql 파일 쿼리입니다.

+1

어떤 오류 메시지 나 기타 정보를 무엇이 잘못에 대해 너는 근래 어떻게하니? 이자형? '$ sqlfile'과'$ sqlFile'에서 두개의 다른 변수를 사용하고'$/S/B '는'$ /'로 확장 될 달러 기호 메타 문자를 포함하고 있음에 유의하십시오. 레코드 분리 기호. – TLP

+0

''db_ql_info (patch_name, branch_name, ftp_path)에 삽입하라 '는 명령문을 준비 할 수 없습니다.''db.sql' 파일이 유효합니다. – Axeman

답변

4

당신은 SQL 파일에 영향을 미칠 수있는 경우에, 당신이 사용할 수있는 자리

insert into ... values(?, ?, ?); 

다음 실행에서 매개 변수를 제공 :

my $ftp_path = "$ftp_loc/$patch_name.tar.gz"; 
$sth->execute($patch_name, $svn_url, $ftp_path) or die ... 

한 번만 문을 준비 할 필요가 그런 식으로 원하는대로 자주 실행할 수 있습니다. 하지만 그 SQL 파일의 출처에 대해서는 잘 모르겠습니다. 완전한 워크 플로우를 명확히 할 수 있다면 도움이 될 것입니다.

0

거기에 몇 가지 문제가 있습니다. 쿼리를 만들기 위해 모든 SQL 파일을 읽어야하지만, 한 번에 한 줄씩 읽고 별도의 쿼리로 각 줄을 실행하려고합니다. <SQL>은 파일에서 다음 줄을 가져옵니다. 파일에 하나의 쿼리가 가정

, 다음과 같은 도움이 될 수 있습니다 :

open(my $SQL_FH, '<', $sqlfile) 
    or die "Can't open file '$sqlFile' for reading: $!"; 

my @sql_statement = <$SQL_FH>; 

close $SQL_FH; 

my $sth = $dbh->prepare(join(' ',@sql_statement)) 
    or die "Can't prepare @sql_statement: $!"; 

$sth->execute(); 

그러나, 당신은 여전히 ​​당신의 SQL 파일에 변수를 확장 할 필요가있다. 이미 제시된대로 자리 표시 자로 바꿀 수 없다면 파일을 eval 또는 어떤 방식 으로든 파싱해야합니다 ...

0

이미 생성 된 문자열을 보간하려면 String::Interpolate 모듈을 사용할 수 있습니다 당신이 파일의 철수하고있는 문자열과 같은 :

while ($sqlStatement = <SQL>) 
{ 
    my $interpolated = new String::Interpolate { patch_name => \$patch_name, svn_url => \$svn_url, ftp_loc => \$ftp_loc }; 
    $interpolated->($sqlStatement); 

    $sth = $dbh->prepare($interpolated) or die qq("Can't prepare $interpolated"); 

    $sth->execute() or die ("Can't execute $interpolated"); 
} 

또는, 수동으로 문자열 교체를 수행 할 수는 보간 수 :

while ($sqlStatement = <SQL>) 
{ 
    $sqlStatement =~ s/\$patch_name/$patch_name/g; 
    $sqlStatement =~ s/\$svn_url/$svn_url/g; 
    $sqlStatement =~ s/\$ftp_loc/$ftp_loc/g; 

    $sth = $dbh->prepare($sqlStatement) or die qq("Can't prepare $sqlStatement"); 

    $sth->execute() or die ("Can't execute $sqlStatement"); 
} 
관련 문제