2014-02-19 3 views
0

perl에서 sqlplus 명령을 통해 sql 연결을 확인하려고합니다. 다음 코드를 사용하여이 작업을 수행했습니다.perl에서 sqlplus 명령을 실행하십시오.

print "Befores\n"; 
$rc=system("sqlplus system/system @sqlfile.sql"); 
print "After $rc\n"; 
sleep(10); 

이번에는 rc의 반환 값이 0입니다. 하지만 내가 잘못된 자격 증명을 줄 때. sqlfile.sql 파일에는 sql 명령 'EXIT'만 포함됩니다.

$rc=system("sqlplus systemabc/system @sqlfile.sql"); 

이 수동으로 자격 증명이 잘못하고, 리턴 코드 0으로 끝나는하지만. 이 문제를 도와주세요 ...

미리 감사드립니다. :)

+0

http://perldoc.perl.org/functions/system.html에 따르면 $? 당신이 찾고있는 정보를 줄 수 있습니다. –

+2

'@ sqlfile'은 보간하려는 실제 Perl 배열입니까, 아니면 실수입니까? 당신은'use strict; 그런 경고를 잡으려고. " 또한,'system'은 명령의 출력을 반환하지 않고 종료 상태를 반환합니다. 출력을 원하면 backticks 나'qx()'를 사용하십시오. – TLP

+0

@TLP : http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch3.htm#sthref798에 따르면 OP는 sqlplus가 sqlfile 파일에서 sql 명령을 실행하도록 올바른 구문을 사용하고 있습니다. SQL. –

답변

0

예 사랑하는 friens ,,, 는 지금은 잘 작동합니다.

@ sqlfile.sql 앞에 '\'를 추가했습니다. 즉, '@'기호를 이스케이프 처리하고 비밀번호 뒤에 데이터베이스 이름을 언급했습니다. 이제 완벽한 출력을 얻고 있습니다. :)

변화는 우는 소리입니다 : 내가 사용

여기
$rc=system("sqlplus -L system/[email protected] \@sqlfile.sql"); 

형식은 다음과 같습니다 SQLPLUS DBNAME \의 @SqlFileContainingMySQLQuries @ -L UNAME/비밀번호

그리고 -L를 지정하지 않음 초기 연결이 성공하지 못하면 사용자 이름 또는 암호를 다시 지정하십시오. more info goto About SQLPLUS

도 sqlfile.sql 전에 '@'기호를 이스케이프하지 않고 시도했지만, 반전 된 혼수 상태에도 적용해야합니다. @에서 언급 한 바와 같이 이중 반전 된 혼수 상태 대신 @ 르네 Nyffenegger :

여기
$rc=system('sqlplus -L system/[email protected] @sqlfile.sql'); 

내가 사용하는 형식은 다음과 같습니다 SQLPLUS UNAME/암호 @의 DBNAME의 @SqlFileContainingMySQLQuries

이것은 또한 잘 작동합니다.

-3

왜이 작업을 수행하고 있습니까? DBI은 데이터베이스를 사용하고 현명하게 출력/반환/오류를 가져 오는 제정신이고 안전한 방법을 제공하기 위해 존재합니다.

+1

어쩌면이 스크립트는 오랫동안 사용되어 왔으며 아무도 원래 개발자가 누구인지 알 수 없으며 유지 보수가 불가능합니다. 그런 경우 OP가 원하는 것을 시도 할 수있는 유효한 이유가 있다고 상상할 수 있습니다. –

+0

@ RenéNyffenegger 설명에서 OP가 원래 개발자가 아니라는 제안은 없습니다. 그럼에도 불구하고 DBI는 데이터베이스와 더 많은 상호 작용 방식을 제공합니다. –

-2

문제는 당신은 큰 따옴표 ("...")에 인용 된 문자열이있는 라인

$rc=system("sqlplus system/system @sqlfile.sql"); 

입니다. 이러한 문자열은 변수를 겹쳐 쓰려고 시도합니다 (@, $%으로 시작). 문자열에 @sqlfile이 있으므로 perl은 이것을 배열로 간주합니다 (물론 그렇지 않습니다).

해결 :

$rc=system('sqlplus system/system @sqlfile.sql'); 
-1

예 ...

$rc=system("sqlplus -L user/user \@sql_file.sql"); 

다 rtrn 코드 지금 내가

$rc=system("sqlplus -L user/[email protected] \@sql_file.sql"); 

그것의 작업으로 변경했습니다 나에게 잘못 : :) 나도 내가 뭘했다, user252025

@ 답을 주셔서 감사합니다을이 시도 좋아 .. 다시 감사 ...

관련 문제