¿Cómo puedo poner en cola un archivo con formato CSV usando SQLPLUS?
143
Quiero extraer algunas consultas a un formato de salida CSV. Desafortunadamente, no puedo usar ningún cliente SQL sofisticado ni ningún idioma para hacerlo. Debo usar SQLPLUS.
Por favor, marque como correcta la respuesta dada por @BobC. Falta el comando spool para imprimir el archivo, pero es la solución más simple para exportar datos en formato csv.
¿Alguien sabe cómo apagar el eco, el obvio "set echo off" no parece funcionar con esto?
Quaternion el
Suponiendo que esto se debe a que está ejecutando un script y escribiendo en un archivo, simplemente debe "desactivar el término"
BobC
155
También podría usar lo siguiente, aunque introduce espacios entre campos.
set colsep ,-- separate columns with a commaset pagesize 0-- No header rowsset trimspool on-- remove trailing blanksset headsep off-- this may or may not be useful...depends on your headings.set linesize X -- X should be the sum of the column widthsset numw X -- X should be the length you want for numbers (avoid scientific notation on IDs)
spool myfile.csvselect table_name, tablespace_name from all_tableswhere owner ='SYS'and tablespace_name isnotnull;
Esto sería mucho menos tedioso que escribir todos los campos y concatenarlos con las comas. Si lo desea, puede seguir con un script sed simple para eliminar los espacios en blanco que aparecen antes de una coma.
Algo como esto podría funcionar ... (mis habilidades sed están muy oxidadas, por lo que es probable que esto necesite trabajo)
Falta el "," en la línea colsep te. También es probable que el headsep off y el tamaño de línea X sean útiles. Edite la respuesta y la aceptaré.
Daniel C. Sobral
55
El comando sed es: cat myfile.csv | sed -e 's / [\ t] * | / | / g; s / | [] * / | / g '> myfile.csv. De todos modos, Oracle realmente apesta.
Stan
2
Y para conseguir un encabezado con los nombres de columna usar set pagesize 1000en lugar de 0. En mi comentario anterior, no se puede redirigir en el mismo archivo: cat myfile.csv | sed -e 's/[ \t]*|/|/g ; s/|[ ]*/|/g' > my_other_file.csv.
Stan
1
Filtré los espacios en blanco y los guiones solían subrayar con grepy trasí grep -v -- ----- myfile.csv | tr -d [:blank:] > myfile.csv.
ixe013
1
@slayernoah, el comando spool puede tomar una ruta de directorio y un nombre de archivo, para que pueda especificar exactamente dónde se colocará el archivo de salida. De lo contrario, dependería de la ubicación donde esté ejecutando el script.
Gabe
35
Uso este comando para scripts que extraen datos para tablas dimensionales (DW). Entonces, uso la siguiente sintaxis:
set colsep '|'set echo offset feedback offset linesize 1000set pagesize 0set sqlprompt ''set trimspool onset headsep off
spool output.datselect'|',<table>.*,'|'from<table>where<conditions>
spool off
Y funciona. No uso sed para formatear el archivo de salida.
Necesito poner en cola el archivo CSV de SQLPLUS, pero el resultado tiene 250 columnas.
Lo que hice para evitar el molesto formato de salida SQLPLUS:
set linesize 9999set pagesize 50000
spool myfile.csvselect xfrom(select col1||';'||col2||';'||col3||';'||col4||';'||col5||';'||col6||';'||col7||';'||col8||';'||col9||';'||col10||';'||col11||';'||col12||';'||col13||';'||col14||';'||col15||';'||col16||';'||col17||';'||col18||';'||col19||';'||col20||';'||col21||';'||col22||';'||col23||';'||col24||';'||col25||';'||col26||';'||col27||';'||col28||';'||col29||';'||col30 as xfrom(... here is the "core"select));
spool off
el problema es que perderá los nombres de encabezado de columna ...
puedes agregar esto:
set heading off
spool myfile.csvselect col1_name||';'||col2_name||';'||col3_name||';'||col4_name||';'||col5_name||';'||col6_name||';'||col7_name||';'||col8_name||';'||col9_name||';'||col10_name||';'||col11_name||';'||col12_name||';'||col13_name||';'||col14_name||';'||col15_name||';'||col16_name||';'||col17_name||';'||col18_name||';'||col19_name||';'||col20_name||';'||col21_name||';'||col22_name||';'||col23_name||';'||col24_name||';'||col25_name||';'||col26_name||';'||col27_name||';'||col28_name||';'||col29_name||';'||col30_name from dual;select xfrom(select col1||';'||col2||';'||col3||';'||col4||';'||col5||';'||col6||';'||col7||';'||col8||';'||col9||';'||col10||';'||col11||';'||col12||';'||col13||';'||col14||';'||col15||';'||col16||';'||col17||';'||col18||';'||col19||';'||col20||';'||col21||';'||col22||';'||col23||';'||col24||';'||col25||';'||col26||';'||col27||';'||col28||';'||col29||';'||col30 as xfrom(... here is the "core"select));
spool off
¿necesitamos ||también subconsultas ?, no creo que sea necesario para las subconsultas. pero sí, se requiere para la selección primaria.
davidb
¿Para qué sirve el exterior adicional select x? Esto debería funcionar sin él. @davidb, tiene razón en que la concatenación no es necesaria en la subconsulta interna primaria, pero alias todas las columnas como col1, col2 ... etc. Se requiere allí.
Amit Naidu
18
Con las versiones más recientes de las herramientas del cliente, existen múltiples opciones para formatear el resultado de la consulta. El resto es ponerlo en cola en un archivo o guardar la salida como un archivo dependiendo de la herramienta del cliente. Estas son algunas de las formas:
SQL * Plus
Usando los comandos SQL * Plus, puede formatear para obtener el resultado deseado. Use SPOOL para poner en cola la salida a un archivo.
Sé que este es un hilo antiguo, sin embargo, noté que nadie mencionó la opción de subrayado, que puede eliminar los subrayados debajo de los encabezados de las columnas.
set pagesize 50000--50k is the max as of 12cset linesize 10000set trimspool on--remove trailing blankspacesset underline off--remove the dashes/underlines under the col headersset colsep ~select*from DW_TMC_PROJECT_VW;
Buena captura en la opción de subrayado, necesitaba esa.
knockando el
Es bueno si desea un csv con una fila superior que contenga el título / encabezados para cada columna. Ayudaría a cualquiera que quiera ver el archivo csv y descubrir lo que está viendo, etc ...
Doc
10
Es crudo, pero:
set pagesize 0 linesize 500 trimspool on feedback off echo offselect'"'|| empno ||'","'|| ename ||'","'|| deptno ||'"'as textfrom emp
spool emp.csv/
spool off
Puede formatear explícitamente la consulta para producir una cadena delimitada con algo similar a:
select'"'||foo||'","'||bar||'"'from tab
Y configure las opciones de salida según corresponda. Como opción, la variable COLSEP en SQLPlus le permitirá producir archivos delimitados sin tener que generar explícitamente una cadena con los campos concatenados juntos. Sin embargo, tendrá que poner comillas alrededor de las cadenas en cualquier columna que pueda contener caracteres de coma incrustados.
Una vez escribí un pequeño script SQL * Plus que usa dbms_sqly dbms_outputpara crear un csv (en realidad un ssv). Puedes encontrarlo en mi repositorio Githup .
Debe tener en cuenta que los valores de los campos pueden contener comas y caracteres de comillas, por lo que algunas de las respuestas sugeridas no funcionarían, ya que el archivo de salida CSV no sería correcto. Para reemplazar los caracteres de comillas en un campo y reemplazarlos con el carácter de comillas dobles, puede usar la función REEMPLAZAR que proporciona Oracle, para cambiar una comilla simple a comilla doble.
set echo offset heading offset feedback offset linesize 1024-- or some other value, big enoughset pagesize 50000set verify offset trimspool on
spool output.csv
select trim('"'|| replace(col1,'"','""')||'","'|| replace(col2,'"','""')||'","'|| replace(coln,'"','""')||'"')-- etc. for all the columnsfrom yourtable
/
spool off
O, si desea el carácter de comillas simples para los campos:
set echo offset heading offset feedback offset linesize 1024-- or some other value, big enoughset pagesize 50000set verify offset trimspool on
spool output.csv
select trim('"'|| replace(col1,'''','''''')||'","'|| replace(col2,'''','''''')||'","'|| replace(coln,'''','''''')||'"')-- etc. for all the columnsfrom yourtable
/
spool off
Use vi o vim para escribir el sql, use colsep con un control-A (en vi y vim preceden el ctrl-A con un ctrl-v). Asegúrese de establecer el tamaño de línea y el tamaño de página en algo racional y active el trimspool y el recorte.
ponerlo en cola en un archivo. Luego...
sed -e 's/,/;/g'-e 's/ *{ctrl-a} */,/g'{spooled file}> output.csv
Esa cosa sed puede convertirse en un guión. El "*" antes y después del ctrl-A exprime todos los espacios inútiles. ¿No es genial que se hayan molestado en habilitar la salida html de sqlplus pero NO en el csv nativo?
Lo hago de esta manera porque maneja comas en los datos. Los convierto en punto y coma.
Hay un problema al usar sqlplus para crear archivos csv. Si desea los encabezados de columna solo una vez en la salida y hay miles o millones de filas, no puede establecer un tamaño de página lo suficientemente grande como para no repetir. La solución es comenzar con pagesize = 50 y analizar los encabezados, luego emitir la selección nuevamente con pagesize = 0 para obtener los datos. Ver script bash a continuación:
#!/bin/bash
FOLDER="csvdata_mydb"
CONN="192.168.100.11:1521/mydb0023.world"
CNT=0376
ORD="0376"TABLE="MY_ATTACHMENTS"
sqlplus -L logn/pswd@//${CONN}<<EOF >/dev/nullset pagesize 50;set verify off;set feedback off;set long 99999;set linesize 32767;set trimspool on;
col object_ddl format A32000;set colsep ,;set underline off;set headsep off;
spool ${ORD}${TABLE}.tmp;select*from tblspc.${TABLE}where rownum <2;
EOF
LINES=`wc -l ${ORD}${TABLE}.tmp | cut -f1 -d" "`[${LINES}-le 3]&&{
echo "No Data Found in ${TABLE}."}[${LINES}-gt 3]&&{
cat ${ORD}${TABLE}.tmp | sed -e 's/ * / /g'-e 's/^ //'-e 's/ ,/,/g'-e 's/, /,/g'| tail -n +3| head -n 1>./${ORD}${TABLE}.headers
}
sqlplus -L logn/pswd@//${CONN}<<EOF >/dev/nullset pagesize 0;set verify off;set feedback off;set long 99999;set linesize 32767;set trimspool on;
col object_ddl format A32000;set colsep ,;set underline off;set headsep off;
spool ${ORD}${TABLE}.tmp;select*from tblspc.${TABLE};
EOF
LINES=`wc -l ${ORD}${TABLE}.tmp | cut -f1 -d" "`[${LINES}-le 3]&&{
echo "No Data Found in ${TABLE}."}[${LINES}-gt 3]&&{
cat ${ORD}${TABLE}.headers >${FOLDER}/${ORD}${TABLE}.csv
cat ${ORD}${TABLE}.tmp | sed -e 's/ * / /g'-e 's/^ //'-e 's/ ,/,/g'-e 's/, /,/g'| tail -n +2| head -n -1>>${FOLDER}/${ORD}${TABLE}.csv
}
Respuestas:
Si está utilizando 12.2, simplemente puede decir
fuente
También podría usar lo siguiente, aunque introduce espacios entre campos.
La salida será como:
Esto sería mucho menos tedioso que escribir todos los campos y concatenarlos con las comas. Si lo desea, puede seguir con un script sed simple para eliminar los espacios en blanco que aparecen antes de una coma.
Algo como esto podría funcionar ... (mis habilidades sed están muy oxidadas, por lo que es probable que esto necesite trabajo)
fuente
set pagesize 1000
en lugar de 0. En mi comentario anterior, no se puede redirigir en el mismo archivo:cat myfile.csv | sed -e 's/[ \t]*|/|/g ; s/|[ ]*/|/g' > my_other_file.csv
.grep
ytr
asígrep -v -- ----- myfile.csv | tr -d [:blank:] > myfile.csv
.Uso este comando para scripts que extraen datos para tablas dimensionales (DW). Entonces, uso la siguiente sintaxis:
Y funciona. No uso sed para formatear el archivo de salida.
fuente
Veo un problema similar ...
Necesito poner en cola el archivo CSV de SQLPLUS, pero el resultado tiene 250 columnas.
Lo que hice para evitar el molesto formato de salida SQLPLUS:
el problema es que perderá los nombres de encabezado de columna ...
puedes agregar esto:
Sé que es un poco duro, pero funciona para mí ...
fuente
||
también subconsultas ?, no creo que sea necesario para las subconsultas. pero sí, se requiere para la selección primaria.select x
? Esto debería funcionar sin él. @davidb, tiene razón en que la concatenación no es necesaria en la subconsulta interna primaria, pero alias todas las columnas como col1, col2 ... etc. Se requiere allí.Con las versiones más recientes de las herramientas del cliente, existen múltiples opciones para formatear el resultado de la consulta. El resto es ponerlo en cola en un archivo o guardar la salida como un archivo dependiendo de la herramienta del cliente. Estas son algunas de las formas:
Usando los comandos SQL * Plus, puede formatear para obtener el resultado deseado. Use SPOOL para poner en cola la salida a un archivo.
Por ejemplo,
Alternativamente, puede usar la nueva pista en SQL Developer .
/*csv*/
Por ejemplo, en mi SQL Developer Versión 3.2.20.10 :
Ahora podría guardar la salida en un archivo.
Nuevo en SQL Developer versión 4.1, use lo siguiente al igual que el comando sqlplus y ejecútelo como script. No es necesario la pista en la consulta.
Ahora podría guardar la salida en un archivo.
fuente
Sé que este es un hilo antiguo, sin embargo, noté que nadie mencionó la opción de subrayado, que puede eliminar los subrayados debajo de los encabezados de las columnas.
fuente
Es crudo, pero:
fuente
Puede formatear explícitamente la consulta para producir una cadena delimitada con algo similar a:
Y configure las opciones de salida según corresponda. Como opción, la variable COLSEP en SQLPlus le permitirá producir archivos delimitados sin tener que generar explícitamente una cadena con los campos concatenados juntos. Sin embargo, tendrá que poner comillas alrededor de las cadenas en cualquier columna que pueda contener caracteres de coma incrustados.
fuente
prefiera usar "set colsep" en el prompt sqlplus en lugar de editar el nombre de col uno por uno. Use sed para editar el archivo de salida.
fuente
Una vez escribí un pequeño script SQL * Plus que usa
dbms_sql
ydbms_output
para crear un csv (en realidad un ssv). Puedes encontrarlo en mi repositorio Githup .fuente
Debe tener en cuenta que los valores de los campos pueden contener comas y caracteres de comillas, por lo que algunas de las respuestas sugeridas no funcionarían, ya que el archivo de salida CSV no sería correcto. Para reemplazar los caracteres de comillas en un campo y reemplazarlos con el carácter de comillas dobles, puede usar la función REEMPLAZAR que proporciona Oracle, para cambiar una comilla simple a comilla doble.
O, si desea el carácter de comillas simples para los campos:
fuente
trim()
es innecesario.Use vi o vim para escribir el sql, use colsep con un control-A (en vi y vim preceden el ctrl-A con un ctrl-v). Asegúrese de establecer el tamaño de línea y el tamaño de página en algo racional y active el trimspool y el recorte.
ponerlo en cola en un archivo. Luego...
Esa cosa sed puede convertirse en un guión. El "*" antes y después del ctrl-A exprime todos los espacios inútiles. ¿No es genial que se hayan molestado en habilitar la salida html de sqlplus pero NO en el csv nativo?
Lo hago de esta manera porque maneja comas en los datos. Los convierto en punto y coma.
fuente
Hay un problema al usar sqlplus para crear archivos csv. Si desea los encabezados de columna solo una vez en la salida y hay miles o millones de filas, no puede establecer un tamaño de página lo suficientemente grande como para no repetir. La solución es comenzar con pagesize = 50 y analizar los encabezados, luego emitir la selección nuevamente con pagesize = 0 para obtener los datos. Ver script bash a continuación:
fuente
Escribí este script puramente SQLPlus para volcar tablas a CSV en 1994.
Como se señaló en los comentarios del script, alguien en Oracle puso mi script en una nota de Soporte de Oracle, pero sin atribución.
https://github.com/jkstill/oracle-script-lib/blob/master/sql/dump.sql
El script también crea un archivo de control y un archivo de parámetros para SQL * LOADER
fuente
fuente
Puede usar la sugerencia csv. Vea el siguiente ejemplo:
fuente