Saltar al contenido

La traducción de sinónimos ORA-00980 ya no es válida en PLSQL

Solución:

Si algo funciona en SQL pero no en PL / SQL, en la mayoría de los casos se trata de un problema de privilegios.

Cualquier privilegio que un usuario haya recibido a través de un papel no está activo cuando ingresa a un bloque PL / SQL. Así que probablemente el SELECT el privilegio sobre la tabla subyacente se otorgó a través de un rol y, por lo tanto, no está “activo” en el bloque PL / SQL.

La cura habitual para esto es otorgar los privilegios directamente al usuario, no a través de un rol.

Gracias a todos los que intentaron ayudar. Esto resultó ser una limitación de Oracle:

https://support.oracle.com/rs?type=doc&id=453754.1

SE APLICA A:

PL / SQL – Versión 9.2.0.8 y posteriores La información de este documento se aplica a cualquier plataforma.
Comprobado por relevancia el 01-abr-2015

SINTOMAS

Un bloque PL / SQL falla con el error: ORA-00980: la traducción de sinónimos ya no es válida, al seleccionar datos de una base de datos remota. El siguiente código demuestra este problema:

En DB3 (cree la tabla)

Pestaña CONNECT u3 / u3 DROP TABLE; Pestaña CREAR TABLA (número c1); INSERT INTO tab VALORES (1); COMETER;

En DB2 (cree un sinónimo de la tabla en DB3)

CONECTAR u2 / u2 DROP DATABASE LINK dblink2; CREAR ENLACE DE BASE DE DATOS dblink2 CONECTAR A u3 IDENTIFICADO POR u3 USANDO ‘EMT102U6’; SELECCIONAR DE [email protected]; DROP SYNONYM syn2; CREAR SYNONYM syn2 PARA [email protected]; SELECCIONAR * DE syn2;

En DB1 (cree un sinónimo del sinónimo en DB2)

CONECTAR u1 / u1 DROP DATABASE LINK dblink1; CREAR UN ENLACE DE BASE DE DATOS dblink1 CONECTARSE A u2 IDENTIFICADO POR u2 USANDO ‘EMT102W6’; SELECCIONAR DE [email protected]; DROP SYNONYM syn1; CREAR SYNONYM syn1 PARA [email protected]; SELECCIONE c1 de syn1;

Esto funciona en SQL pero falla cuando se llama desde PL / SQL

DECLARE num NUMBER; COMIENCE A SELECCIONAR c1 EN num FROM syn1; FIN; /

ERROR en la línea 4: ORA-06550: línea 4, columna 3: PL / SQL: ORA-00980: la traducción de sinónimos ya no es válida ORA-06550: línea 4, columna 3: PL / SQL: Declaración SQL ignorada

PORQUE

Este problema se informó en el error 2829591 CONSULTAS DESDE UN PROCEDIMIENTO PL / SQL EN 9I -> 8I-> 7.3.4, OBTENIENDO ORA-980. Este error se cerró como ‘NO ES UN ERROR’ por las siguientes razones

PL / SQL no puede indicar a la base de datos intermedia (DB2) que siga el enlace de la base de datos durante la fase de compilación. Por lo tanto, para que este bloque PL / SQL se compile y se ejecute, ambos enlaces de base de datos dblink1 y dblink2 deben definirse en la base de datos de front-end – DB1. Durante el tiempo de ejecución, el enlace de la base de datos dblink2 se buscará en DB2 como se esperaba.

SOLUCIÓN

Para implementar la solución, ejecute los siguientes pasos:

  1. Cree un enlace de base de datos dblink2 en DB1 apuntando a DB3

SQL> crear enlace de base de datos dblink2 conectar a u3 identificado por u3 usando ‘EMT102U6’;

  1. Cree y compile el bloque PL / SQL en DB1.

CREAR ENLACE DE BASE DE DATOS dblink2 CONECTAR A u3 IDENTIFICADO POR u3 USANDO ‘EMT102U6’;

SELECCIONAR DE [email protected]; DECLARE num NUMBER; EMPEZAR
SELECCIONE c1 EN num DE syn1; FIN; / PL / SQL procedimiento completado con éxito.

SUGERENCIA: Otra opción es utilizar SQL dinámico en el bloque PL / SQL como solución alternativa. Cuando se usa SQL dinámico, el enlace de la base de datos no se resuelve en tiempo de compilación sino en tiempo de ejecución.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *