Función en la sección WITH, vista interna
En la versión 12 de la base de datos Oracle. Por favor, ayúdame a entender por qué obtengo un error tan exótico como
ORA-03113: fin de archivo en el canal de comunicación.
Quiero crear una vista materializada, dentro de la cual la solicitud utiliza una determinada función. Dicho esto, no puedo utilizar la solicitud dentro de esta función. A continuación se muestra un modelo simplificado (que recrea la situación de error).
CREAR VISTA MATERIALIZADA my_test_view
CONSTRUIR INMEDIATAMENTE
REFRESCAR COMPLETO A PETICIÓN
COMO
CON
FUNCION test_func(pInput varchar2) COMO VARCHAR2 RETURN
v_output varchar2 (1000);
comienzo
si pInput es nulo entonces
volver nulo;
final si;
SELECT ‘test’
en v_output
DESDE dual;
– v_output: = ‘test res’;
regresar v_output;
excepción
cuando no_data_found then
regresar pInput;
fin;
SELECT test_func(‘test val’) col_1 FROM dual;
Al mismo tiempo, si mueves el comentario a la solicitud desde dual, entonces el error no ocurre.
CREAR VISTA MATERIALIZADA my_test_view
CONSTRUIR INMEDIATAMENTE
REFRESCAR COMPLETO A PETICIÓN
COMO
CON
FUNCION test_func(pInput varchar2) COMO VARCHAR2 RETURN
v_output varchar2 (1000);
comienzo
si pInput es nulo entonces
volver nulo;
final si;
– SELECT ‘test’
– en v_output
– DESDE dual;
v_output: = ‘test res’;
regresar v_output;
excepción
cuando no_data_found then
regresar pInput;
fin;
SELECT test_func(‘test val’) col_1 FROM dual;
¿Qué puede estar mal? ¿Hay alguna restricción en Oracle?
davy.ai
El error ORA-03113 indica que la conexión con la base de datos se ha perdido de forma inesperada. En este caso, puede ser causado por el hecho de que la sentencia SELECT dentro de la función test_func no está devolviendo ningún dato, lo que desencadena la excepción no_data_found. Sin embargo, esta excepción no se maneja correctamente en la función, ya que simplemente devuelve el parámetro de entrada en lugar de manejar la excepción adecuadamente.
Cuando la vista materializada intenta actualizarse, llama a la función test_func, que genera la excepción y provoca el error de fin de archivo en el canal de comunicación.
Mover el comentario a la sentencia SELECT desde dual evita el error porque la función ahora devuelve un valor sin que se genere ninguna excepción.
Para solucionar el problema, la excepción no_data_found debe manejarse correctamente en la función, ya sea devolviendo un valor predeterminado o volviendo a generar la excepción.