es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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.

Comments are closed.