31/05/2026
Semanario Técnico: Python + PL/SQL
🎯 DÍA 6: Paquetes, Cursores y Errores
El nivel profesional: REF CURSOR, packages y excepciones
Este es el nivel que diferencia al programador junior del senior. Los paquetes PL/SQL organizan el código, los REF CURSOR devuelven conjuntos de datos, y el manejo de errores hace el sistema robusto.
📦 Llamar procedimientos de un PAQUETE
Sintaxis: cursor.callproc('nombre_paquete.nombre_procedimiento',
[params])
Ejemplo:cur.callproc('PKG_EMPLEADOS.registrar_empleado', [datos])
Funciones de paquete: cur.callfunc('PKG_NOMINA.calcular_salario', tipo,
[params])
El paquete encapsula la lógica → Python solo llama la interfaz pública.
🔄 REF CURSOR → Devolviendo conjuntos de datos
Cuando un procedimiento devuelve múltiples filas, usa REF CURSOR.
En Python: ref_cursor = cur.var(oracledb.CURSOR).
Pasa ref_cursor como parámetro OUT al procedimiento.
Luego itera: for fila in ref_cursor.getvalue(): print(fila).
⚠️ Manejo de errores y transacciones
Usa try/except oracledb.Error para capturar errores de Oracle.
e.args[0].code → código del error ORA-###XX.
e.args[0].message → descripción del error.
conn.commit() → confirma cambios; conn.rollback() → revierte.
¡Siempre usar commit/rollback explícito con DML!
Ejemplo: Paquete + REF CURSOR + Manejo de Errores
import oracledb
try:
conn = oracledb.connect(user='usr', password='pwd', dsn='host:1521/XE')
# Llamar procedimiento de paquete que devuelve REF CURSOR
with conn.cursor() as cur:
ref_cursor = cur.var(oracledb.CURSOR)
cur.callproc('PKG_EMPLEADOS.listar_por_depto',
[10, ref_cursor])
# Iterar el cursor devuelto
cursor_resultado = ref_cursor.getvalue()
for fila in cursor_resultado:
print(f'ID: {fila[0]} | Nombre: {fila[1]}')
conn.commit() # Confirmar si hubo cambios
except oracledb.Error as e:
error_obj = e.args[0]
print(f'Error ORA-{{error_obj.code}}: {{error_obj.message}}')
conn.rollback() # Revertir si falla
finally:
conn.close() # Siempre cerrar
📌 Mañana: Resumen general, buenas prácticas y el reto de la semana.