2013-03-28 5 views
0

내 스크립트가 일부 쿼리의 출력을 텍스트 파일로 스풀링하고 있습니다. 질의 1의 모든 행에 출력을위한 내가 원하는SQLPlus 후행 공백 문제

set linesize 200 
set trimspool on 
.... 

spool "C:\someFile.txt" 
SELECT rpad(field1, 50)||rpad(field2, 50) FROM table1; 
SELECT rpad(field3, 200) FROM table2; 
spool off 

은 후행 공백 포함 100 자, 그리고 쿼리 2의 모든 행에 출력을위한 마지막 공백 포함 200 자합니다.

trimspool이 꺼져있는 경우 모든 줄에 200 자까지 표시됩니다. 원하는 줄이 아닙니다. 이 옵션이 켜져있는 경우 field3의 길이가 10자인 경우 출력 파일에서 해당 행의 길이는 60 자 (100 자 여야합니다)입니다. 파일은 외부 서버로 보내지고 길이가 고정되어 있다는 가정하에 파싱되기 때문에 각 줄은 고정 길이 여야합니다.

내가 명시 적으로 출력하는 공백을 자르는 것을 피할 방법이 있습니까?

답변

2

이 작동합니다 : 당신이 그 제거 할 만 쿼리 결과를 포함하는 경우, 스크립트 파일에있는 모든 명령을 넣어 바로 실행할 수 있도록

set trimspool off 
spool "C:\someFile.txt" 
set linesize 100 
SELECT rpad(field1, 50)||rpad(field2, 50) FROM table1; 
set linesize 200 
SELECT rpad(field3, 200) FROM table2; 
spool off 

출력은 스스로 명령을 포함 스크립트 파일. 또한 스크립트 상단에 다음을 추가하십시오.

set echo off 
set termout off 
set pagesize 0 
set feedback off 
+0

감사합니다. 나는 그런 식으로'set'을 사용할 수 있다는 것을 몰랐습니다. 거기에 한 가지 상황이 나를 위해 작동하지 않습니다 :'SELECT case When WHERE field1 = 1 THP rpad (field2, 50) ELSE rpad (field3, 200) END FROM table1'. 해당 쿼리에 사용할 수있는 항목이 있는지, 50 줄 또는 200 줄과 항상 200 줄이 아닌지 알 수 있습니까? – DiscoInfiltrator

+0

하나의 레코드에서 다음 레코드로 너비를 바꿀 수있는 방법이 없습니다. 기본적인 문제는'SELECT'는 오라클 명령이고'SET LINESIZE'는 SQL * Plus 명령입니다. "SELECT"가 "Oracle world"에서 진행되는 동안 "SQL * Plus"세계에 도달하여 회선 크기를 전환 할 수 없습니다. 트리밍 된 행이나 길이 100의 세트 하나와 길이 200의 세트 하나를 가지고 살 수 없다면, 이후에 파일을 망칠 지 또는'UTL_File'을 사용하는 저장 프로 시저를 작성하는 것과 같은 새로운 접근 방식이 필요합니다. 라이브러리 또는 C/Java/C#/PHP/쿼리 및 쓰는 프로그램. –

+0

그래, 그게 내가 생각했던거야. 묻는 데 해가되지 않습니다. – DiscoInfiltrator