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-2015SINTOMAS
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:
- 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’;
- 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.