2016-07-12 3 views
0

필자는 필자가 작성한 Perl 스크립트가 Oracle에 연결되어 있습니다. 이 스크립트는 PERL64가 설치된 컴퓨터에서 완벽하게 작동합니다. ActiveState PerlApp를 사용하여이 스크립트를 EXE로 변환하려고했습니다. 다시 말하지만, 내 컴퓨터에서 완벽하게 작동합니다. 실행 파일이 Perl을 포함하지 않는 시스템에 있으면 DLL이 Oracle에 연결하는 데 필요합니다.Windows 실행 파일로 컴파일 된 Perl 스크립트가 Oracle에 연결하지 않습니다.

use DBI; 

    # CONFIG VARIABLES 
our $database = "database.app.net"; 
our $host = "server.app.net"; 
our $port = "1522"; 
our $user = "SVC_app"; 
our $pw = 'Password'; 

# DATA SOURCE NAME 
our $dsn = "dbi:Oracle:$host:$port/$database"; 

# PERL DBI CONNECT 
our $connect = DBI->connect($dsn, $user, $pw); 

# PREPARE THE QUERY 
our $query = 'SELECT Blah FROM database."table" where "blah" = ?'; 
our $query_handle = $connect->prepare($query); 

# EXECUTE THE QUERY 
$query_handle->execute($value); 

# BIND TABLE COLUMNS TO VARIABLES 
$query_handle->bind_columns(undef, \$return); 

# LOOP THROUGH RESULTS 
while($query_handle->fetch()) { 
    #print "$return"; 
} 

내가 나타나는 오류는 다음과 같습니다

모듈 DBD :: Oracle 용 '자동/DBD/오라클/Oracle.dll'로드 할 수 없습니다 : LOAD_FILE을 : 지정된 모듈에서 찾을 수 없습니다 사전에 /DynaLoader.pm 라인 (224)

감사

+0

필자는 PerlApp를 한번도 사용하지 않았지만, [docs] (http://docs.activestate.com/pdk/6.0/PerlApp.html#perlapp__2d_2dbind_file)는'--bind' 옵션을 사용할 수 있다고 제안합니다. 추가 DLL을 포함합니다. 나는 당신이 코드를로드 할 필요가 있는지, 아니면 자동적으로 찾을 수 있을지 확신 할 수 없다. –

+0

bind 옵션을 시도했지만 dll을 포함하고 temp 디렉토리에 던져 버리는 것으로 보입니다. 그러나 앱은 그게 거기 있다는 것을 모릅니다. –

답변

1

두 가지 경우가 있습니다

    ,536,
  • 대상 컴퓨터에 DLL 파일이 없다면 작동하지 않을 것입니다. DLL 파일은 실행 파일에 링크되어 있지 않습니다 (이름에서 알 수 있듯이 동적 라이브러리가 아니라 정적 라이브러리 임)
  • 대상 컴퓨터에 DLL 파일이 있지만 찾을 수없는 경우 몇 가지 가능한 설명. 파일은 예를 들어 PATH에 없을 수 있습니다. 또는 파일이 올바른 사용 권한을 가지고 있지 않을 수 있습니다. 특히 서비스 (기본적으로 다른 사용 권한이있는 시스템 계정에서 실행되는 서비스)에서 실행 파일을 호출하는 경우에 유용합니다.

또한, Window는 DLL 파일에 대해 까다롭기 만합니다. Oracle.dll이 누락되었다고 말할 수도 있지만, 실제로 누락 된 것은 종속 항목 중 하나 일 수 있습니다. 어쩌면 OCI.dll? 그리고 동일한 이름을 가진 둘 이상의 DLL 파일이있는 경우 적절한 버전이 아니기 때문에 어느 DLL이로드되었는지 확인하십시오.

파일이있는 경우 하나의 버전 만 있고 PATH에 있고 여전히 찾을 수 없기 때문에 필요한 DLL에서 regsvr32 명령을 실행하여 수동으로 파일을 등록 해보십시오.

+0

실행 파일에서이를 마무리 할 방법이 없습니까? –

+0

이렇게하려면 Oracle 정적 라이브러리가 필요하지만 최근에 뭔가가 변경되지 않는 한 Oracle은 Windows 용 정적 라이브러리를 제공하지 않습니다. https://community.oracle.com/thread/2495648?tstart=0을 참조하십시오. (그리고 심지어 가지고 있어도 Visual C++로 작성된 표준 C/C++ 응용 프로그램이 아닙니다.) – ChatterOne

+0

이 옵션을 사용하면 어떨까요? DLL을 결합하기 위해 다른 스크립트에서 발견 한 ** - PerlEz.dll [file = \ perl \ bin \ PerlEz.dll, extract] ** –

1

EXE를 실행중인 시스템에 Oracle 클라이언트를 별도로 설치해야합니다.

ActiveState의 PDK에있는 PerlApp은 오라클의 재배포 계약에 위배되므로 EXE에 Oracle 클라이언트를 래핑하지 않습니다.

관련 문제