# 🔬 shape_lib en Oracle 19c: cómo sobrevivir al parcheo sin perder tu geometría

Por **La Botica del DBA** | Oracle

---

## 🧪 Introducción boticaria

En la botica del DBA, cada componente tiene su lugar, como en una antigua farmacia donde cada frasco tiene su fórmula precisa. En el mundo de Oracle Spatial, `shape_lib` es ese ingrediente activo que, si se pierde tras un parcheo, puede hacer que tu entorno GIS se vuelva disfuncional.

Este no es un simple parche. Estamos hablando de **Oracle RAC 19c sobre OCI**, con **bases multitenant (CDB/PDB)**, **Fleet Patching**, y **external procedures**. Cuando el sistema se parchea, y tus funciones espaciales desaparecen... no necesitás suerte: **necesitás bisturí técnico y diagnóstico boticario**.

---

## 🌍 ¿Qué es una Spatial Database?

En la botica del DBA también almacenamos mapas, coordenadas, geometrías y redes. Una **Spatial Database** no es más que una base de datos que sabe de territorio, caminos y posiciones: **almacena, consulta y analiza datos espaciales y geoespaciales.**

En el mundo Oracle, esta capacidad cobra vida gracias a [**Oracle Spatial and Graph**](https://docs.oracle.com/en/database/oracle/oracle-database/19/spatl/index.html), una extensión nativa de Oracle Database, plenamente soportada en la versión **19c**, que convierte tu base en un verdadero **sistema de información geográfica (GIS)** empresarial.

### 🧠 ¿Qué permite hacer Oracle Spatial and Graph?

Esta potente extensión habilita a **desarrolladores, analistas GIS y DBAs expertos** a realizar tareas de análisis espacial avanzado, integrando servicios basados en ubicación, visualización cartográfica e incluso **IA geoespacial**.

### **🧪 Funciones destacadas en Oracle 19c:**

* **📐 Almacenamiento y consulta 2D/3D**  
    Soporte para geometrías complejas (puntos, líneas, polígonos, modelos urbanos y gemelos digitales).
    
* **🗺️ Visualización cartográfica avanzada**  
    Mapas interactivos, teselas vectoriales y uso del índice geoespacial jerárquico H3.
    
* **🧭 Geocodificación y enrutamiento**  
    Obtención de coordenadas desde direcciones, cálculo de rutas óptimas y análisis de redes físicas y lógicas.
    
* **🤖 Inteligencia Artificial Espacial**  
    Integración de aprendizaje automático sobre datos geoespaciales para patrones y predicciones.
    
* **🧰 Oracle Spatial Studio**  
    Herramienta de autoservicio para generar mapas y análisis sin necesidad de escribir código.
    

**🔗 Enlaces de referencia:**

* [📚 Oracle Spatial and Graph - Developer's Guide 19c (Oracle Docs)](https://docs.oracle.com/en/database/oracle/oracle-database/19/spatl/index.html)
    
* [🌐 Wikipedia: Oracle Spatial and Graph](https://en.wikipedia.org/wiki/Oracle_Spatial_and_Graph)
    
* [🔬 Oracle: Spatial and Graph Overview](https://www.oracle.com/database/technologies/spatialandgraph.html)
    

---

## 🧠 ¿Qué es `shape_lib`?

`shape_lib` es una **librería externa (**`.so`**)** que Oracle utiliza mediante el proceso `extproc` para ejecutar funciones espaciales avanzadas (por ejemplo: `SDO_GEOM.SDO_AREA`). Herramientas como **ArcGIS** o **MapInfo** dependen de ella.

Para funcionar, necesita una receta precisa en tres frascos clave:

* `extproc.ora` → archivo de configuración para procesos externos
    
* `listener.ora` y `tnsnames.ora` → rutas y servicios bien definidos
    
* Declaración en la base → vía `CREATE LIBRARY`
    

---

## 🧨 El problema post-parcheo: ¡shape\_lib desaparece!

Después de aplicar un parche (ya sea con **Fleet** o manualmente), en un entorno RAC sobre OCI, observamos:

* Se sobrescribe `extproc.ora`, y se pierde:
    
    ```plaintext
    SET EXTPROC_DLLS=ANY
    ```
    
* Las funciones espaciales en el esquema `SDE` dejan de funcionar.
    
* `DBA_LIBRARIES` ya no muestra la referencia a `shape_lib`.
    

---

## 🔧 Tratamiento boticario paso a paso

#### ✅ 1. Restaurar `extproc.ora`

Editá el archivo en todos los nodos RAC:

```plaintext
/u01/app/19.x.x.x/grid/hs/admin/extproc.ora
```

Asegurate de que contenga:

```plaintext
SET EXTPROC_DLLS=ANY
```

> ⚠️ *Recuerda aplicarlo en todos los nodos: ej.* `nodobotica-bbaa1` *y* `nodobotica-aabb2`*.*

#### ✅ 2. Validar y (re)crear la librería

Desde la PDB (ej: `BOTICAD19`) ejecutá:

```sql
ALTER SESSION SET CONTAINER = BOTICAD19;

SELECT library_name, file_spec
FROM dba_libraries
WHERE file_spec LIKE '%shape_lib%';
```

Si no aparece:

```sql
CREATE OR REPLACE LIBRARY shape_lib AS '/u01/app/oracle/shape_lib.so';
GRANT EXECUTE ON shape_lib TO SDE;
```

#### ✅ 3. Reiniciar instancias para recargar extproc

Podés hacerlo manualmente o con Clusterware:

```sql
srvctl stop database -d botica19c_oci -f
srvctl start database -d botica19c_oci
```

---

### 🧪 Validaciones post-receta

Desde el usuario `SDE` o `SYS`:

```sql
SELECT SDO_GEOM.SDO_AREA(shape, 0.05)
FROM sde.<tu_tabla_espacial>
WHERE ROWNUM = 1;
```

Si ves errores como:

* `ORA-28575: unable to open RPC connection to external procedure agent`
    
* `ORA-06520` o `ORA-06522`  
    \=&gt; Algo sigue fallando en `extproc.ora`, el listener o el path del `.s.o`.
    

---

### 📋 Checklist de la botica

| Elemento | Validación rápida |
| --- | --- |
| `extproc.ora` | Tiene `SET EXTPROC_DLLS=ANY` |
| Librería en `DBA_LIBRARIES` | Existe en la PDB correspondiente |
| Permisos | `GRANT EXECUTE` aplicado a `SDE` |
| Servicios | `srvctl status service -d botica19c_oci` |
| Funciones espaciales | Ejecutan correctamente (`SDO_GEOM`) |

---

### 🧪 Bonus SQL para diagnóstico

```sql
-- ¿Dónde estoy?
SHOW CON_NAME;

-- Ver librerías externas activas
SELECT library_name, file_spec
FROM dba_libraries
WHERE file_spec IS NOT NULL;

-- Estado de instancias
SELECT instance_name, status FROM v$instance;

-- PDBs abiertas
SELECT name, open_mode FROM v$pdbs;

-- Validar función espacial
SELECT SDO_GEOM.SDO_AREA(shape, 0.05)
FROM sde.<tu_tabla_espacial>
WHERE ROWNUM = 1;
```

---

### 🧪 Conclusión boticaria

**En la botica del DBA**, una sola línea omitida puede apagar todo un sistema geoespacial. Pero con bisturí técnico, `srvctl`, y el diagnóstico adecuado, **la geometría vuelve a respirar**.

Si enfrentaste un caso similar, o si tienes tu propia fórmula secreta post-parcheo, te invitamos a compartirla con la comunidad.

💬 Escribeme en [admin@laboticadeldba.com](mailto:admin@laboticadeldba.com)  
🧴 *Aquí recetamos soluciones, no excusas.*
