Мне необходимо выполнить буферизацию csv из таблицы в Oracle, используя sqlplus. Ниже приведен требуемый формат:
"HOST_SITE_TX_ID","SITE_ID","SITETX_TX_ID","SITETX_HELP_ID"
"664436565","16","2195301","0"
"664700792","52","1099970","0"
Ниже приведен соответствующий фрагмент сценария оболочки, который я написал:
sqlplus -s $sql_user/$sql_password@$sid << eof >> /dev/null
set feedback off
set term off
set linesize 1500
set pagesize 11000
--set colsep ,
--set colsep '","'
set trimspool on
set underline off
set heading on
--set headsep $
set newpage none
spool "$folder$filename$ext"
select '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
from cvo_admin.MISSING_HOST_SITE_TX_IDS;
spool off
(Я использовал некоторые закомментированные утверждения, чтобы обозначить то, что я пробовал, но не мог приступить к работе)
Я получаю следующий результат:
'"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
"TRANSPORT INC","113","00000000","25-JAN-13 10.17.51 AM",""
"TRANSPORT INC","1905","00000000","25-JAN-13 05.06.44 PM","0"
Это показывает, что заголовок испорчен - буквально печатается вся строка, которую следовало интерпретировать как оператор sql, как в случае с отображаемыми данными.
Варианты, которые я рассматриваю:
1) Использование кольцепа
set colsep '","'
spool
select * from TABLE
spool off
Это вызывает другие проблемы, так как данные, содержащие начальные и конечные пробелы, первое и последнее значения в файлах, не заключаются в кавычки.
HOST_SITE_TX_ID"," SITE_ID"
" 12345"," 16"
" 12345"," 21
Я пришел к выводу, что этот метод вызывает у меня больше изжоги, чем тот, который я описал ранее.
2) Получение файла и использование регулярного выражения для изменения заголовка.
3) Полностью оставить заголовок и вручную добавить строку заголовка в начало файла, используя скрипт
Вариант 2 более выполним, но меня все еще интересовало, есть ли лучший способ каким-то образом отформатировать заголовок, чтобы он был в обычном формате csv (с разделителями-запятыми, с ограничениями в двойные кавычки).
Я стараюсь делать как можно менее жесткое кодирование - таблица, которую я экспортирую, содержит около 40 столбцов, и в настоящее время я запускаю сценарий для около 4 миллионов записей, разбивая их партиями по 10 КБ каждая. Я был бы очень признателен за любые предложения, даже если они полностью отличаются от моего подхода - я программист в процессе обучения.