» » Экспорт данных из Oracle в файл (sqlplus)

Экспорт данных из Oracle в файл (sqlplus)

Экспорт данных из Oracle в файл (sqlplus)
 
 
Инструкция по реализации экспорта данных из таблицы Oracle в файл на shell (windows cmd) или на bash для unix-систем. 
Используется стандартный интерпритатор SQLPlus, которого вполне достаточно для организации регулярных выгрузок в txt, csv файл. 

1) Создаем SQL файл с именем export_items, где описываем что и откуда выбираем в SELECT и в какой файл записываем.
В моем примере записывается в файл по пути C:/export/export_file.txt:

 
SET TRIMSPOOL ON;
	SET ECHO OFF;
	SET TRIMOUT ON;
	SET LINESIZE 50;
	SET PAGESIZE 0; 
	SET FEEDBACK OFF;
	SET TIMING OFF;
	SET HEADING OFF;
	SET VERIFY OFF;
	SET TERMOUT OFF;
	SPOOL c:/export/export_file.txt;
	whenever oserror exit 1
	whenever sqlerror exit 2
	select ID_ITEM from SCHEME.ITEM_LIST where STATUS is not null;
	SPOOL OFF;
	exit 0;
 
SET PAGESIZE 50  - через каждые N строк будет показан header с именами полей. Для импорта в текстовый файл или csv категорически не подходит, рекомендую ставить 0
SET COLSEP "," - разделитель колонок ","
SET LINESIZE 50 - количество символов в строке. По достижению установленного количества - оставшаяся часть будет переброщена на новую строку.
SET TRIMSPOOL ON - удаляет пробелы в конце строки в файле вывода. Например значение содержит 20 символов, LINESIZE=50, будет обрезано 30 пробелов
SET TRIMOUT ON - удаляет пробелы в конце строки при выводе. Например значение содержит 20 символов, LINESIZE=50, будет обрезано 30 пробелов в файле вывода.
SET FEEDBACK OFF - отключает вывод ифнормационной строки с числом выбранных запросом строк. Например: "25 rows selected" в конце вывода в консоль.
SPOOL file_path.txt - сообщает интерпритатору о старте записи в файл file_path.txt. Будет писать результат всех запросов после ввода
SPOOL OFF - останавливает сессию записи в файл

2) Скрипт для запуска

под Windows простой .bat:
 
@echo off
		sqlplus username/password@TEST @C:/export/export_items.sql 
 
Под unix платформу нашел скрипт на просторах сети. Выгрузка происходит в csv:
#!/usr/bin/bash
		
		FILE="emp.csv"
		
		
		sqlplus -s scott/tiger@XE  <<EOF
		
		
		SET PAGESIZE 50000
		SET COLSEP ","
		SET LINESIZE 200
		SET FEEDBACK OFF
		
		
		SPOOL $FILE
		
		
		SELECT * FROM EMP;
		
		
		SPOOL OFF
		EXIT
		EOF
 
UPD: чтобы выгружать данные в CSV без пробелов лучше использовать объединяющую конструкцию и писать данные единой строкой:
		SPOOL c:/export/export.csv;
		select product_id||';'||trim(name)||';'||trim(value1)||';'||(value2) FROM EMP;
		SPOOL OFF;