2016-08-03 6 views
0

결과를 여러 CSV 파일로 출력하고 각 파일의 특정 행 번호를 잘라 내기를 원합니다. 다음을 시도했지만 여러 쿼리를 작성하지 않으려 고합니다.oracle sqlplus는 행 번호별로 여러 파일로 스풀링합니다.

set colsep , 
DEFINE SPOOL_BASE_NAME = "spool" 
DEFINE PAGE_SIZE = 10 
DEFINE PAGE_NO = 1 
DEFINE SPOOL_EXT=".csv" 
SPOOL &SPOOL_BASE_NAME.&PAGE_NO.&SPOOL_EXT 

SELECT * 
     FROM (SELECT a.*,rownum rnum 
FROM (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a 
      WHERE rownum <= &PAGE_SIZE * &PAGE_NO) 
     WHERE rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1; 
SPOOL OFF 

DEFINE PAGE_NO = 2 
SPOOL &SPOOL_BASE_NAME.&PAGE_NO 
SELECT * 
     FROM (SELECT a.*,rownum rnum 
FROM (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a 
      WHERE rownum <= &PAGE_SIZE * &PAGE_NO) 
     WHERE rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1; 
SPOOL OFF 
+2

는'당신이 사용해야합니까 이것에 대한 SQL * Plus'? 'SQL * Plus'에서 하나의 파일을 생성 한 다음 'SQL * Plus'를 호출 한 다음 작은 덩어리로 파일을 분할하는 일괄 처리 스크립트를 작성하는 것이 훨씬 더 쉬울 것입니다. 또는'utl_file'을 사용하여 루프 내에서 파일을 생성하십시오. –

+0

저는 리눅스를 사용하고 있는데, 그 배치 파일은 어떻게 생겼을까요? – Dom

+0

'split -l <> file_name'처럼 쉽습니다. 여기서'<>은 파일 당 원하는 행의 수입니다. http://www.theunixschool.com/2012/10/10-examples-of-split -command-in-unix.html –

답변

0

SQLPLUS 루프의 개념을 가지고 있지 않지만 핵심 SQL과 스크립트를 가질 수 있도록 매개 변수를 받아들이는 SQLPLUS 스크립트를 만들 수 있습니다, 다음과 같이 보이는, extract.sql 말 :

명령 줄에서 스크립트를 실행하는 경우, SET 용어 OFF가 화면에 의해 스크롤에서 데이터를 방지하고 SQLPLUS 더 입력을 기다리는 놀아 넣은 사람은 아니다, 그래서 마지막에 EXIT를 포함하는 것이 는
DEFINE SPOOL_BASE_NAME = "spool" 
DEFINE PAGE_SIZE = 10 
DEFINE PAGE_NO = &1 
DEFINE SPOOL_EXT=".csv" 
SPOOL &SPOOL_BASE_NAME.&PAGE_NO.&SPOOL_EXT 
SET TERM OFF 

SELECT * 
     FROM (SELECT a.*,rownum rnum 
FROM (SELECT username, account_status,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM dba_users order by username) a 
      WHERE rownum <= &PAGE_SIZE * &PAGE_NO) 
     WHERE rnum >= &PAGE_SIZE * (&PAGE_NO - 1) + 1; 
SPOOL OFF 
EXIT 

참고. 즉

sqlplus username/[email protected] @extract.sql <pagenum> 

: this로

명령 줄에서 호출 할 수

sqlplus username/[email protected] @extract.sql 1 
sqlplus username/[email protected] @extract.sql 2 
sqlplus username/[email protected] @extract.sql 3 
... 
이의 보너스가 다른 병렬로 그들의 무리를 실행할 수 있다는 것입니다

터미널/cmd 창을 닫아서 다른 하나가 끝날 때까지 기다리지 않아야합니다. 숫자를 생성하고 위의 스크립트를 호출하는 외부 루프와

,

[면책 조항 :. 휘발성 소스에 사용 된 경우 보장이 일관된 결과를 생성하지 않습니다]