데이터베이스의 테이블을 탭으로 구분 된 값 파일로 내 보내야합니다. Perl 및 SQL Plus에서 DBI를 사용하고 있습니다. 그것은 지원 (DBI 또는 SQL 플러스) 수출 및 또는 TSV 파일에서 가져 오기합니까?어떻게 탭으로 구분 된 값에 오라클 테이블을 내보낼 수 있습니까?
필요한 경우 코드를 작성할 수 있지만 사용할 수있는 경우 준비된 솔루션을 사용하고 싶습니다.
데이터베이스의 테이블을 탭으로 구분 된 값 파일로 내 보내야합니다. Perl 및 SQL Plus에서 DBI를 사용하고 있습니다. 그것은 지원 (DBI 또는 SQL 플러스) 수출 및 또는 TSV 파일에서 가져 오기합니까?어떻게 탭으로 구분 된 값에 오라클 테이블을 내보낼 수 있습니까?
필요한 경우 코드를 작성할 수 있지만 사용할 수있는 경우 준비된 솔루션을 사용하고 싶습니다.
탭으로 구분 된 값을 가진 파일에 테이블을 덤프하는 것은 비교적 간단해야합니다. 예를 들어
: 데이터가 탭이나 줄 바꿈 중 하나가 포함되어있는 경우이 잘 작동하지 않습니다
open(my $outputFile, '>', 'myTable.tsv');
my $sth = $dbh->prepare('SELECT * FROM myTable');
$sth->execute;
while (my $row = $sth->fetchrow_arrayref) {
print $outputFile join("\t", @$row) . "\n";
}
close $outputFile;
$sth->finish;
참고.
제공된 정보에서 sqlplus에 대해 언급 한 DBI를 사용하여 Oracle 인스턴스에 연결하는 것으로 추측됩니다.
"준비된"솔루션을 원한다면 가장 좋은 방법은 "yasql
"(또 다른 SQLplus) 인 oracle 용 DBD :: Oracle 기반 데이터베이스 쉘을 사용하는 것입니다.
yasql에는 sql select 문을 작성하고 출력을 해당 쉘에서 직접 CSV 파일로 리디렉션 할 수있는 멋진 기능이 있습니다 (Text :: CSV_XS가 필요함).
반면에 DBD::Oracle 및 Text::CSV_XS으로 자신의 스크립트를 굴릴 수 있습니다. 당신의 문 핸들이 준비되고 실행되면, 당신이 할 필요가있다 :
$csv->print ($fh, $_) for @{$sth->fetchrow_array};
당신이 레코드 분리 등의 탭이 $의 CSV 초기화 한 가정. 자세한 내용은 Text::CSV_XS 문서를 참조하십시오.
필자는 이전에이 작업을 수행해야했습니다 ... 실행하려는 쿼리를 전달한 sqlplus를 통해 전달하는 펄 스크립트가 있습니다. | 사용자가 탭을 원하는 경우
물론open(UNLOAD, "> $file"); # Open the unload file.
$query =~ s/;$//; # Remove any trailng semicolons.
# Build the sql statement.
$cmd = "echo \"SET HEAD OFF
SET FEED OFF
SET COLSEP \|
SET LINES 32767
SET PAGES 0
$query;
exit;
\" |sqlplus -s $DB_U/$DB_P";
@array = `$cmd`; # Execute the sql and store
# the returned data in "array".
print $cmd . "\n";
clean(@array); # Remove any non-necessary whitespace.
# This is a method to remove random non needed characters
# from the array
foreach $x (@array) # Print each line of the
{ # array to the unload file.
print UNLOAD "$x\|\n";
}
close UNLOAD; # Close the unload file.
내가 파이프를 만드는 중이라서 위는 ... 그냥 대신의의 \ t이 필요 delimeted : 여기 발췌입니다 인쇄에서.
다음은 awk 및 sqlplus와 관련된 접근 방법입니다. 당신은 awk 스크립트를 저장하거나 oneliner를 복사/붙이기를 사용할 수 있습니다. 필드가 clobbered되지 않도록 HTML 출력 모드를 사용합니다.
스토어 sqlplus2tsv.awk 등이 스크립트 :
긴 문자열과 이상한 문자로이를 테스트하지 않았 , 그것은 내 사용 사례에 근무
# This requires you to use the -M "HTML ON" option for sqlplus, eg:
# sqlplus -S -M "HTML ON" [email protected] @script | awk -f sqlplus2tsv.awk
#
# You can also use the "set markup html on" command in your sql script
#
# Outputs tab delimited records, one per line, without column names.
# Fields are URI encoded.
#
# You can also use the oneliner
# awk '/^<tr/{l=f=""}/^<\/tr>/&&l{print l}/^<\/td>/{a=0}a{l=l$0}/^<td/{l=l f;f="\t";a=1}'
# if you don't want to store a script file
# Start of a record
/^<tr/ {
l=f=""
}
# End of a record
/^<\/tr>/ && l {
print l
}
# End of a field
/^<\/td>/ {
a=0
}
# Field value
# Not sure how multiline content is output
a {
l=l $0
}
# Start of a field
/^<td/ {
l=l f
f="\t"
a=1
}
. 진취적인 영혼은이 기술을 펄 래퍼에 적용 할 수 있습니다 :)
일반적으로 모든 데이터 열에 포함 탭이 포함되지 않도록 구조적 파일을 생성하려면 원시 조인을 피하는 것이 가장 좋습니다. 문제를 방지하려면이 열 내부의 구분은 큰 따옴표로 포함되도록 텍스트 :: CSV_XS를 사용하는 것이 최선이 될 것입니다. 이 상황에 대해 올바르게 경고했습니다. Text :: CSV_XS를 사용하면 더 튼튼합니다. –
데이터 중 탭 (이진 데이터 일 수도 있음)이 있으면 문제가 발생할 수 있습니다. Test :: CSV_XS를 사용하여 레코드를 생성 할 수 있습니다. –