Prácticamente, acabo de escribir un ejemplo de cómo hacer esto con archivos de texto sin formato que se aplicarán igualmente bien a xml archivos Consulte la pregunta actualización de las filas de la tabla según el archivo txt
.
Resulta que puedes hacer esto con psql :
regress=> CREATE TABLE xmldemo(id serial primary key, blah xml);
regress=> \set test = `cat some.xml`
regress=> INSERT INTO xmldemo(blah) VALUES (:'test');
INSERT 0 1
Si está haciendo mucho de esto, es posible que desee drive psql usando un co-proceso
o al menos para generar SQL y canalizarlo a psql 's stdin, por lo que no tiene que hacer toda la configuración/desconexión de la conexión una y otra vez.
Alternativamente, hacerlo con el shell:
#!/bin/bash
xmlfilename=$1
sep=$(printf '%04x%04x\n' $RANDOM $RANDOM)
psql <<__END__
INSERT INTO mytable(myxmlcolumn) VALUES (
\$x${sep}\$$(cat ${xmlfilename})\$x${sep}\$
);
__END__
La generación de separadores aleatorios es para protegerse contra ataques de inyección (poco probables) que se basan en conocer o adivinar la etiqueta del separador de cotización del dólar.
Vas a ser mucho más cuerdo y feliz si usa un lenguaje de secuencias de comandos adecuado y una biblioteca de cliente PostgreSQL como Perl con DBI y DBD::Pg , Python con psycopg2 o Ruby con el Pg joya para cualquier trabajo no trivial. El trabajo significativo con bases de datos en el shell genera dolor, sufrimiento y un uso excesivo de coprocesos.