perl에서 DBI를 써서 데이터를 처리하는 도중에 텍스트 파일을 읽어서 비교하기.

rarry99의 이미지

개발자는 아니고 인프라 컨설팅을 배우고 있는 사람입니다.
개인 프로젝트로 perl을 이용해서 HR연동 프로그램을 만들고 있는데 잘안되고 있어서 글올립니다.
일단 MSSQL에서 DBI로 데이터 읽고나서 텍스트를 읽어서 출력하려 하는데 구문에 오류가 없어보이는데도 아래 항목의 4번째에서 텍스트 출력이 안됩니다.
고수님들의 지도편달 부탁드립니다.
#!c:\perl\bin\perl.exe

use DBI; #DBI모듈 사용
# 1.dept_info의 값을 읽어서 공백을 잘라내고 화면에 출력
#DB에 접속
$dbh = DBI->connect('DBI:ODBC:ADM', 'root', 'P@ssw0rd');
$sth = $dbh->prepare( q{ select * from dept_info }); # 쿼리 준비
$sth->execute; # 쿼리 실행
while (($user_deptcode,$user_deptname,$parent_deptcode,$sortcode) = $sth->fetchrow_array) {
$user_deptcode =~ s/^\s+|\s+$//g;
$user_deptname =~ s/^\s+|\s+$//g;
$parent_deptcode =~ s/^\s+|\s+$//g;
$sortcode =~ s/^\s+|\s+$//g;
open( FILEHANDLE, '>>c:\windows\temp\DEPT-Metadata.tmp');
print "$user_deptcode,$user_deptname,$parent_deptcode,$sortcode\n";
print FILEHANDLE "$user_deptcode,$user_deptname,$parent_deptcode,$sortcode\n";
close FILEHANDLE;
}
$sth->finish;
$dbh->disconnect;

# 2.user_info의 값을 읽어서 공백을 자르고 화면에 출력
#(user_info)select Query실행
$dbh = DBI->connect('DBI:ODBC:ADM', 'root', 'P@ssw0rd');
$sth = $dbh->prepare( q{ select * from user_info }); # 쿼리 준비
$sth->execute; # 쿼리 실행

#(user_info)fetchrow_array 에 있는 값을 불러와서 화면에 출력
while (($user_id,$user_pwd,$user_sabun,$user_name,$user_juminnum,$user_mail_cns,$user_deptcode,$user_dutycode,$user_jobclass,$user_cellnum,$user_phonenum,$user_faxnum) = $sth->fetchrow_array) {
$user_id =~ s/^\s+|\s+$//g;
$user_pwd =~ s/^\s+|\s+$//g;
$user_sabun =~ s/^\s+|\s+$//g;
$user_name =~ s/^\s+|\s+$//g;
$user_juminnum =~ s/^\s+|\s+$//g;
$user_mail_cns =~ s/^\s+|\s+$//g;
$user_deptcode =~ s/^\s+|\s+$//g;
$user_dutycode =~ s/^\s+|\s+$//g;
$user_jobclass =~ s/^\s+|\s+$//g;
$user_cellnum =~ s/^\s+|\s+$//g;
$user_phonenum =~ s/^\s+|\s+$//g;
$user_faxnum =~ s/^\s+|\s+$//g;
open( FILEHANDLE, '>>c:\windows\temp\USER-Metadata.tmp');
print "$user_id,$user_pwd,$user_sabun,$user_name,$user_juminnum,$user_mail_cns,$user_deptcode,$user_dutycode,$user_jobclass,$user_cellnum,$user_phonenum,$user_faxnum\n";
print FILEHANDLE "$user_id,$user_pwd,$user_sabun,$user_name,$user_juminnum,$user_mail_cns,$user_deptcode,$user_dutycode,$user_jobclass,$user_cellnum,$user_phonenum,$user_faxnum\n";
close FILEHANDLE;
}
$sth->finish;
$dbh->disconnect();

exec ('"dsquery ou forestroot >>c:\windows\temp\ds-ou.tmp & dsquery user | dsget user -samid >>c:\windows\temp\samid.tmp"');

# 3.user_info의 값을 읽어서 공백을 자르고 화면에 출력
#(user_info)select Query실행
$dbh = DBI->connect('DBI:ODBC:ADM', 'root', 'P@ssw0rd');
$sth = $dbh->prepare( q{ select * from user_info }); # 쿼리 준비
$sth->execute; # 쿼리 실행
while (
($user_id,$user_pwd,$user_sabun,$user_name,$user_juminnum,$user_mail_cns,$user_deptcode,
$user_dutycode,$user_jobclass,$user_cellnum,$user_phonenum,$user_faxnum) = $sth->fetchrow_array) {
$user_id =~ s/^\s+|\s+$//g;
$user_pwd =~ s/^\s+|\s+$//g;
$user_sabun =~ s/^\s+|\s+$//g;
$user_name =~ s/^\s+|\s+$//g;
$user_juminnum =~ s/^\s+|\s+$//g;
$user_mail_cns =~ s/^\s+|\s+$//g;
$user_deptcode =~ s/^\s+|\s+$//g;
$user_dutycode =~ s/^\s+|\s+$//g;
$user_jobclass =~ s/^\s+|\s+$//g;
$user_cellnum =~ s/^\s+|\s+$//g;
$user_phonenum =~ s/^\s+|\s+$//g;
$user_faxnum =~ s/^\s+|\s+$//g;
print "$user_id,$user_pwd,$user_sabun,$user_name,$user_juminnum,$user_mail_cns,$user_deptcode,$user_dutycode,$user_jobclass,$user_cellnum,$user_phonenum,$user_faxnum\n";
}
$sth->finish;
$dbh->disconnect();

# 4.여기서 부터 SAMID를 읽음.
use strict;

open (SAMID, " my $line;
while( $line = ){
$line =~ s/^\s+|\s+$//g;
chomp($line);
print "$line\n";
}
close SAMID;

#4번은 자꾸 글이 안올려지네요.. 4번 자체에는 문제가 없으며 4번만 잘라서 실행하면 문제가 없지만 함께 실행하면 실행이 안되네요.. TT

aero의 이미지

코드를 대강 보니 코딩스타일과 깔끔한 처리를 위한 정리가 필요할듯 합니다만
일단 그것은 논외로 하고.. 문제가 발생하는 원인만 찾아보면

마지막 4번째 절차라는곳에서 SAMID라는 파일핸들로 중간에
exec ('"dsquery ou forestroot >>c:\windows\temp\ds-ou.tmp & dsquery user | dsget user -samid >>c:\windows\temp\samid.tmp"');
라는 부분에서 만들어진 samid.tmp 파일을 열어서 찍는것 같은데
거기서 결과가 나오지 않는 이유는 Perl에서 exec함수는 결과를 기다리지 않고
단지 그냥 실행시킬뿐 실행의 종료 성공/실패등 아무런 결과를 기다리지 않습니다.
반면 system 함수는 프로세스를 fork시키고 결과를 기다리며 그 성공/실패 여부를 리턴하죠.

4번을 같이 실행시키면 프로그램처리의 속도가 빨라 exec의 결과로 파일이 만들어지기도 전에
존재하지도 않는 파일을 열고 내용을 찍을려고 하면 내용이 있을리가 없지요.

따로 실행시켰을때는 제대로 보이는 이유는 exec의 결과가 4번과정을 따로 실행시키기
전에 파일생성이 끝나기 때문입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.