El manejo de excepciones es un mecanismo para identificar, tratar y recuperar el flujo normal de un programa en ejecución. El lenguaje de BigQuery nos permite gestionar los errores cuando estos ocurren en nuestras consultas SQL. Miremos unos ejemplos.
El siguiente bloque de BigQuery tratará de ejecutar una consulta a una tabla que no existe (tabla_no_existente). El sub-bloque tiene un manejo de excepción de tipo ``ERROR``.
DECLARE error STRING; BEGIN BEGIN -- Primera consulta, fallará. SELECT * FROM mydataset.tabla_no_existente; EXCEPTION WHEN ERROR THEN SET error = 'Ha ocurrido una excepcion.'; RAISE; -- Termina la ejecución de todo el bloque. La segunda consulta no se realizará. END; -- Segunda consulta. SELECT * FROM mydataset.tabla_existente LIMIT 1; END;
Si queremos que la segunda consulta se ejecute aún si ocurre un error en la primera consulta, entonces tan solo quitamos la instrucción ``RAISE``, la cual se utiliza para generar explícitamente un error o reactivar una excepción existente.
Tendríamos lo siguiente:
DECLARE error STRING; BEGIN BEGIN -- Primera consulta, fallará. SELECT * FROM mydataset.tabla_no_existente; EXCEPTION WHEN ERROR THEN SET error = 'Ha ocurrido una excepcion.'; END; -- Segunda consulta. Se ejecuta aunque la primera haya fallado. SELECT * FROM mydataset.tabla_existente LIMIT 1; END;
La primera consulta fallará, pero no se terminará la ejecución del bloque completo. Se ejecutará la segunda consulta.
¿Cómo obtener información detallada del error ocurrido?
Crearemos un Stored Procedure que nos permitirá mostrar a detalle el error en la ejecución de una consulta SQL en BigQuery.
CREATE OR REPLACE PROCEDURE `mydataset.exec_sp_error`(OUT error_flag STRING) BEGIN -- Esta consulta fallará. SELECT usuario,* FROM mydataset.tabla_no_existente; EXCEPTION WHEN ERROR THEN SET error_flag = "Error: "; SET error_flag = concat(salida, @@error.message); SET error_flag = concat(salida, ". Causa: "); SET error_flag = concat(salida, @@error.statement_text); END;
Invocamos el Stored Procedure y consultamos la variable ``error_flag``:
DECLARE error_flag STRING; -- Invocamos el Stored Procedure CALL`mydataset.exec_sp_error`(error_flag); -- Mostrará el error a detalle SELECT error_flag;
En lenguajes de programación como Java, C++ y C# se puede hacer algo como esto:
try{ int divide = 1/0; }catch(ArithmeticException ex){ System.err.printf("%s\n", ex.getCause()); System.err.printf("%s\n", ex.getMessage()); ex.printStackTrace(); }
Lo cual disparará una excepción de tipo ``ArithmeticException``, pues no podemos dividir un número por cero.
En BigQuery el código equivalente sería:
BEGIN SELECT 1/0; -- División por cero. EXCEPTION WHEN ERROR THEN SELECT @@error.message AS error_message; SELECT @@error.stack_trace AS stack_trace; SELECT @@error.statement_text AS text_error; END;
Cuando se lance la excepción se mostrará los errores en la consola de BigQuery.
Continuaremos sobre esta serie de BigQuery más adelante.
Enlaces:
https://codemonkeyjunior.blogspot.com/2024/11/stored-procedures-oracle-plsql-gcp.htmlhttps://cloud.google.com/bigquery/docs/error-messages
No hay comentarios:
Publicar un comentario