Insertar y extraer ficheros en una tabla de Oracle con un campo BLOB usando código Python. Un ejemplo de inserción de registro en tabla Oracle, con un campo BLOB, selección de registros (para mostrar el contenido de una tabla) y extracción de documentos de campos BLOB de Oracle.
En primer lugar, crearemos la tabla «factura» en nuestra base de datos Oracle, usando el siguiente SQL:
1 2 3 4 5 6 7 |
CREATE TABLE factura ( codigo NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, fecha DATE DEFAULT SYSDATE, cliente VARCHAR(150), importe DECIMAL(10,2), factura BLOB ); |
Crearemos la tabla en Oracle, en este caso usando Oracle SQL Developer. Dicha tabla contiene el campo «factura» de tipo BLOB, que será donde almacenemos los documentos:

El código Python para insertar un registro en la tabla Oracle con un campo BLOB que permite insertar y extraer ficheros:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
import oracledb # Conexión al servidor de base de datos Oracle cadenaConexion = oracledb.makedsn("localhost", "1521", service_name="ORCLCDB") conexionOracle = oracledb.connect(user="SYSTEM", password="contraseña", dsn=cadenaConexion) # Inserta un registro en la tabla de Oracle con un campo de # tipo BLOB para insertar un fichero def insertarFactura(pCliente, pImporte, pFactura): try: # Leer el fichero en modo binario with open(pFactura, "rb") as file: facturaBLOB = file.read() # Insertar el registro en la tabla, con el fichero adjunto with conexionOracle.cursor() as cursor: sql = "insert into factura (cliente, importe, factura) VALUES (:cliente, :importe, :factura)" cursor.execute(sql, cliente=pCliente, importe=pImporte, factura=facturaBLOB) conexionOracle.commit() print("Factura insertada correctamente en la tabla de Oracle.") except Exception as e: print(f"Error al insertar la factura: {e}") # Estráe un fichero de la tabla de Oracle del campo tipo BLOB def extraerFactura(pCodigo, pRutaDestino): try: with conexionOracle.cursor() as cursor: # Obtener el fichero BLOB de la tabla sql = "select factura from factura where codigo = :codigo" cursor.execute(sql, codigo=pCodigo) # Obtenemos el primer registro de la # consulta SQL (solo debe obtener uno al ser el código clave primaria) resultado = cursor.fetchone() if resultado: facturaLOB = resultado[0] # Objeto LOB de la tabla Oracle facturaBYTES = facturaLOB.read() # Convertimos LOB en bytes # Guardamos el fichero en la ruta y nombre indicados with open(pRutaDestino, "wb") as file: file.write(facturaBYTES) print(f"Factura extraída correctamente en {pRutaDestino}.") else: print(f"No se ha encontrado la factura con el código {pCodigo}.") except Exception as e: print(f"Error al extraer la factura: {e}") def mostrarFacturas(): try: with conexionOracle.cursor() as cursor: # Consulta para obtener todos los registros de la tabla factura # Como ejemplo, el campo "factura" al ser BLOB no se puede # mostrar directamente, lo que hacemos es mostrar su tamaño sql = "select codigo, fecha, cliente, DBMS_LOB.GETLENGTH(factura) as Factura_Bytes from factura" cursor.execute(sql) resultados = cursor.fetchall() if resultados: print("Listado de facturas:") print("-" * 50) print("{:<5} {:<20} {:<30} {:<10}".format("Código", "Fecha", "Cliente", "Factura (bytes)")) print("-" * 50) for factura in resultados: codigo, fecha, cliente, tamano = factura print(f"{codigo:<5} {fecha.strftime('%Y-%m-%d %H:%M:%S'):<20} {cliente:<30} {tamano:<10}") else: print("No hay facturas en la tabla.") except Exception as e: print(f"Error al mostrar las facturas: {e}") # ** Probar el código Python ** # Insertar varias facturas con fichero adjunto insertarFactura(pCliente="ProyectoA 1", pImporte=1010.55, pFactura=r"D:\ProyectoA_Factura\Factura1.pdf") insertarFactura(pCliente="ProyectoA 2", pImporte=21545.95, pFactura=r"D:\ProyectoA_Factura\Factura2.pdf") insertarFactura(pCliente="ProyectoA 3", pImporte=800, pFactura=r"D:\ProyectoA_Factura\Factura145.pdf") insertarFactura(pCliente="ProyectoA 2", pImporte=256.05, pFactura=r"D:\ProyectoA_Factura\Factura205.pdf") insertarFactura(pCliente="ProyectoA 1", pImporte=10.8, pFactura=r"D:\ProyectoA_Factura\Factura343.pdf") insertarFactura(pCliente="ProyectoA 3", pImporte=258.89, pFactura=r"D:\ProyectoA_Factura\Factura95.pdf") # Mostrar los registros de la tabla factura mostrarFacturas() #Extraer varios ficheros de factura de varias facturas extraerFactura(1, r"D:\ProyectoA_Factura\Fatura_Extraida1.pdf") extraerFactura(2, r"D:\ProyectoA_Factura\Fatura_Extraida2.pdf") extraerFactura(5, r"D:\ProyectoA_Factura\Fatura_Extraida5.pdf") |
Para probar el código Python, modificaremos los datos de conexión para incluir los de nuestro servidor Oracle Database, modificando los valores del servidor, puerto, SID de la base de datos, usuario y contraseña de las líneas:
1 2 |
cadenaConexion = oracledb.makedsn("localhost", "1521", service_name="ORCLCDB") conexionOracle = oracledb.connect(user="SYSTEM", password="contraseña", dsn=cadenaConexion) |
Y prepararemos varios ficheros PDF (pueden ser de cualquier otro formato) en una carpeta`, en este caso en «D:\ProyectoA_Factura»:

Compilaremos el código Python anterior, que buscará los ficheros PDF en la carpeta D:\ProyectoA_Factura, e insertará un registro con cada fichero. Tras insertar los registros en la tabla de Oracle, mostrará un listado por pantalla de los registros insertados y extraerá tres ficheros PDF de tres de los registros insertados:

Los ficheros extraídos de la tabla Oracle:

Por supuesto, podremos abrir cualquiera de ellos y comprobar que se han extraído de la tabla de Oracle perfectamente:
