Error -746 en sp

Hola!
Tenemos un sp que tiene varios controles internos y en las excepciones retorna por ejemplo:

RAISE EXCEPTION -746,0,‘Alumno no es regular’;

En la versión 2.6 de Guaraní si el RecordCount() de ese sp era menor a 0, dábamos el error de la excepción. Como se manejan esas situaciones en G3W2?

Saludos!
Flavia

Hola Flavia, tenés dos opciones:

  1. Manejar el error desde el stored procedure:
    Es decir, el error se captura y el procedure siempre retorna valores, nunca sale con ERROR de base de datos. En este caso, en el desarrollo se deberá contemplar esta situación y ante un retorno del procedure esperado (ej: -1 es error, 1 es ok) saber qué hacer.
    Ejemplo:

ON EXCEPTION SET sql_err, isam_err, error_info
	RAISE EXCEPTION sql_err, isam_err, 'Error: ' || error_info;
END EXCEPTION;

  1. Manejar la excepción en PHP:

En donde vayas a realizar la consulta al modelo, hacer un try/catch
Por ejemplo:


try {
	$this->data = catalogo::consultar(php de acceso al modelo (modelo/datos/db), nombre de la función que realiza la consulta); 
				} catch (error_kernel_db $e) {
				//manejar el error, por ejemplo:
				if (codigo de error) {
					//acciones a realizar
				} else {
					throw $e;
				}
				
}


Deberías corroborar en este caso, que en el php donde vas a capturar el error tengas la clase definida:


use kernel\error_kernel_db;

Cualquier duda consultanos.

Flavia, ese procedure sale con un raise exception? Porque el -746 es para formatear los errores y sacar un mensaje entendible por el usuario…

Una cosa que el procedure devuelva valores y lso errores se capturen:


CREATE PROCEDURE .....()  RETURNING integer, varchar(255);

ON EXCEPTION IN (-391)
   RETURN -1, 'Error de clave primaria de la tabla xxxxxxx';
END EXCEPTION;
BEGIN
  .......
  RETURN  1, 'OK';
END;

En este caso el procedure no sale con error, es decir sale con un error pero que solo lo entiende quien ejecutó el procedure, no es un error de base de datos.

En este otro ejemplo si hubiere un error en el procedure, el mismo captura y sale del procedure con un RAISE EXCEPTION, con lo cual desde donde se ejecutó el procedure este da un error de base de datos, que en este caso va el codigo de error en sql_error, en otros casos el error se formatea a un mensaje mas adecuado al usuario, como ser:
RAISE EXCEPTION -746, 0, ‘Error. El alumno X no actualizó los datos censales’;

CREATE PROCEDURE .....()  RETURNING integer, varchar(255);

  -- blk de excepciones
  ON EXCEPTION SET sql_err, isam_err, error_info
       RAISE EXCEPTION  sql_err, isam_err, error_info;
  END EXCEPTION;
BEGIN
  .......
END;

o este tambien sale con un raise exception:

CREATE PROCEDURE abc()  RETURNING integer, varchar(255);

  -- blk de excepciones
  ON EXCEPTION SET sql_err, isam_err, error_info
       RAISE EXCEPTION  -746, isam_err, 'Error en el procedure abc' ;
  END EXCEPTION;
BEGIN
  .......
END;

El codigo -746 lo que permite es reemplazar el error_info por el mensaje que se desee enviar ante un error.

En los casos de procedures que no tengan captura de errores con el bloque “on exception … end exception;” si hubiere un error se corta la ejecución del procedure y sale con error con un “Raise Exception”.