Saltar al contenido

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

Si encuentras algún detalle que no entiendes nos puedes dejar un comentario y trataremos de ayudarte rápidamente.

Solución:

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

Cualquier privilegio que un usuario recibió a través de un role no está activo cuando ingresa un bloque PL/SQL. Así que lo más probable es que el SELECT el privilegio en 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.
Verificado por relevancia el 1 de abril de 2015

SÍNTOMAS

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 (crear la tabla)

Pestaña CONNECT u3/u3 DROP TABLE; Pestaña CREAR TABLA (número c1); INSERTAR EN la pestaña VALORES (1); COMPROMETERSE;

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

CONECTAR u2/u2 SOLTAR ENLACE DE LA BASE DE DATOS dblink2; CREAR ENLACE DE BASE DE DATOS dblink2 CONECTAR A u3 IDENTIFICADO POR u3 UTILIZANDO ‘EMT102U6’; SELECCIONAR DE [email protected]; CAÍDA SINÓNIMO syn2; CREAR SINÓNIMO syn2 PARA [email protected]; SELECCIONE * DESDE syn2;

En DB1 (cree un sinónimo para el sinónimo en DB2)

CONECTAR u1/u1 SOLTAR ENLACE DE LA BASE DE DATOS dblink1; CREAR ENLACE DE BASE DE DATOS dblink1 CONECTAR A u2 IDENTIFICADO POR u2 USANDO ‘EMT102W6’; SELECCIONAR DE [email protected]; CAÍDA SINÓNIMO syn1; CREAR SINÓNIMO syn1 PARA [email protected]; SELECCIONE c1 de syn1;

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

DECLARAR num NUMERO; COMENZAR SELECCIONAR c1 EN num DESDE syn1; FINAL; /

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

CAUSA

Este problema se informó en el error 2829591 CONSULTA 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 ejecute, ambos enlaces de base de datos, dblink1 y dblink2, deben definirse en la base de datos frontal: 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 conectarse 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 UTILIZANDO ‘EMT102U6’;

SELECCIONAR DE [email protected]; DECLARAR num NUMERO; EMPEZAR
SELECCIONE c1 EN num DESDE syn1; FINAL; / Procedimiento PL/SQL completado con éxito.

CONSEJO: 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.

Agradecemos que quieras añadir valor a nuestro contenido tributando tu experiencia en las aclaraciones.

¡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 *