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.

Trabajo de enlace de Python – procedimiento almacenado de Snowflake no devuelve mensaje de error exacto.

Estoy intentando ejecutar un procedimiento almacenado de Snowflake a través de un trabajo de pegamento de Python, pero cuando obtengo algún error en las declaraciones SQL en el procedimiento almacenado, quiero que el procedimiento salga y el trabajo de pegamento falle.

Estoy usando este código en mi procedimiento almacenado de Snowflake:

create or replace procedure schema.PROC_TEST
(input_sql varchar(16777216))
returns string not null
language javascript
as
$$
snowflake.execute({sqlText:BEGIN TRANSACTION;});
try
{
var QueryExec = INPUT_SQL+ “;”;
var QueryResult = snowflake.execute({sqlText: QueryExec});
}
catch (err) // Capturando cualquier error que ocurra en INPUT_SQL
{
result = ”Error: ‘ + err’;
snowflake.execute({sqlText:ROLLBACK;});
return result;
throw err.message;
}
$$;

Ahora, si paso la siguiente consulta de entrada (aquí, proc_test_final1 es un nombre de tabla incorrecto):

insert into schema.proc_test_final1
select id, name, sal
from schema.proc_test_src;

En lugar de lanzar un error de ‘nombre de tabla incorrecto’, el procedimiento devuelve un error genérico como:

Error: 090232 (25000): Stored procedure execution error: Scoped transaction started in stored procedure is incomplete and it was rolled back

Pensé que podría ser debido al comando ROLLBACK, así que intenté eliminar el comando pero aún así falló con el mismo error anterior. También intenté quitar la variable de resultado en el bloque catch pero todavía se capturó el error anterior.

Quiero capturar el error SQL específico exacto (error de sintaxis/error de código) en mi trabajo de pegamento.

A continuación se muestra mi código de trabajo de pegamento donde estoy capturando el error:

inputsql = 'insert into schema.proctestfinal1 select id, name, sal from schema.proctestsrc'
try:
    fCallProc = "call TESTPROC('"+inputsql+"');"
    cur.execute(f_CallProc)
    print(cur.fetchall())
    cur.close()
    ctx.close()

except snowflake.connector.errors.ProgrammingError as err:
    print('Error: {0} ({1})'.format(err.msg, err.sfqid))
    cur.close()
    ctx.close()
    sys.exit(1)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¿Hay alguna manera de capturar el error SQL específico exacto en mi trabajo de Glue?

    Sí, puede capturar el error SQL específico exacto en su trabajo de Glue. Para hacer esto, debe modificar el código de su procedimiento almacenado para incluir una declaración RAISE_APPLICATION_ERROR. Esta declaración generará un error con un código de error y un mensaje específicos que puede capturar en su trabajo de Glue.

    Por ejemplo, puede modificar el código de su procedimiento almacenado para incluir la siguiente declaración:

    RAISE_APPLICATION_ERROR(-20000, 'Error: nombre de tabla incorrecto');

    Luego, en el código de su trabajo de Glue, puede capturar el código de error y el mensaje específicos agregando el siguiente código:

    excepto snowflake.connector.errors.ProgrammingError como err:
    si err.sfqid == -20000:
    imprimir('Error: nombre de tabla incorrecto')
    más:
    imprimir('Error: {0} ({1})'.formato (err.msg, err.sfqid))
    cur.close()
    ctx.close()
    sys.exit(1)

    De esta manera, puede capturar el error SQL específico exacto en su trabajo de Glue.

Comments are closed.