Python 粘合作业 - Snowflake 存储过程未返回准确的错误消息
Python Glue job - Snowflake stored procedure not returning exact error message
我正在尝试通过 python 粘合作业执行雪花存储过程,但是当我在存储过程中的 SQL 语句中遇到任何错误时,我希望该过程退出并且粘合作业应该会失败。
我在我的雪花存储过程中使用这段代码:
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) // Catching any error if occurs in INPUT_SQL
{
result = 'Error: ' + err;
snowflake.execute({sqlText:`ROLLBACK;`});
return result;
throw err.message;
}
$$;
现在,如果我按如下方式传递输入查询(此处 proc_test_final1
是不正确的 table 名称):
insert into schema.proc_test_final1
select id, name, sal
from schema.proc_test_src;
过程 returns 不是抛出错误 'incorrect table name',而是像
这样的一般错误
Error: 090232 (25000): Stored procedure execution error: Scoped transaction started in stored procedure is incomplete and it was rolled back
我认为这可能是因为 ROLLBACK 命令,所以我尝试删除该命令但仍然失败并出现与上述相同的错误。我也尝试删除 catch 块中的结果变量,但仍然捕获到上述错误。
我想在我的粘合作业中捕获确切的特定 SQL 错误(语法 error/code 错误)。
下面是我发现错误的粘合作业代码:
input_sql = 'insert into schema.proc_test_final1 select id, name, sal from schema.proc_test_src'
try:
f_CallProc = "call TEST_PROC('"+input_sql+"');"
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)
当您运行 SP 具有明确的 START TRANSACTION,但没有明确的“ROLLBACK”或“COMMIT”时,将发生错误“Scoped transaction started in stored procedure is incomplete and it was rolled back
”。
在我的测试中,如果我没有以下行:
snowflake.execute({sqlText:`ROLLBACK;`});
您的 SP 将因此类错误而失败。
但是,当我有这一行时,它将失败并显示以下错误:
Error: SQL compilation error:
Schema 'ERICLIN.SCHEMA' does not exist or not authorized.
我想这就是你想要的。
你能再检查一下你的SP吗?您是否复制并粘贴了正确的?
顺便说一句,你原来的 SP 不会 运行,因为没有名为“input_sql”的变量,它应该是“INPUT_SQL”,因为 Snowflake 中的每个变量SP 是大写的。
===========================
更新
请看下面的执行输出:
create or replace procedure 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) {
result = 'Error: ' + err;
snowflake.execute({sqlText:`ROLLBACK;`});
return result;
}
$$;
call PROC_TEST('insert into schema.proc_test_final1 select id, name, sal from schema.proc_test_src');
+-----------------------------------------------------------+
| PROC_TEST |
|-----------------------------------------------------------|
| Error: SQL compilation error: |
| Schema 'ERICLIN.SCHEMA' does not exist or not authorized. |
+-----------------------------------------------------------+
如果没有 ROLLBACK 调用,它会产生与您的错误相同的错误:
create or replace procedure 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) {
result = 'Error: ' + err;
return result;
}
$$;
call PROC_TEST('insert into schema.proc_test_final1 select id, name, sal from schema.proc_test_src');
090232 (25000): Stored procedure execution error: Scoped transaction started in stored procedure is incomplete and it was rolled back.
我正在尝试通过 python 粘合作业执行雪花存储过程,但是当我在存储过程中的 SQL 语句中遇到任何错误时,我希望该过程退出并且粘合作业应该会失败。
我在我的雪花存储过程中使用这段代码:
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) // Catching any error if occurs in INPUT_SQL
{
result = 'Error: ' + err;
snowflake.execute({sqlText:`ROLLBACK;`});
return result;
throw err.message;
}
$$;
现在,如果我按如下方式传递输入查询(此处 proc_test_final1
是不正确的 table 名称):
insert into schema.proc_test_final1
select id, name, sal
from schema.proc_test_src;
过程 returns 不是抛出错误 'incorrect table name',而是像
这样的一般错误Error: 090232 (25000): Stored procedure execution error: Scoped transaction started in stored procedure is incomplete and it was rolled back
我认为这可能是因为 ROLLBACK 命令,所以我尝试删除该命令但仍然失败并出现与上述相同的错误。我也尝试删除 catch 块中的结果变量,但仍然捕获到上述错误。
我想在我的粘合作业中捕获确切的特定 SQL 错误(语法 error/code 错误)。
下面是我发现错误的粘合作业代码:
input_sql = 'insert into schema.proc_test_final1 select id, name, sal from schema.proc_test_src'
try:
f_CallProc = "call TEST_PROC('"+input_sql+"');"
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)
当您运行 SP 具有明确的 START TRANSACTION,但没有明确的“ROLLBACK”或“COMMIT”时,将发生错误“Scoped transaction started in stored procedure is incomplete and it was rolled back
”。
在我的测试中,如果我没有以下行:
snowflake.execute({sqlText:`ROLLBACK;`});
您的 SP 将因此类错误而失败。
但是,当我有这一行时,它将失败并显示以下错误:
Error: SQL compilation error:
Schema 'ERICLIN.SCHEMA' does not exist or not authorized.
我想这就是你想要的。
你能再检查一下你的SP吗?您是否复制并粘贴了正确的?
顺便说一句,你原来的 SP 不会 运行,因为没有名为“input_sql”的变量,它应该是“INPUT_SQL”,因为 Snowflake 中的每个变量SP 是大写的。
===========================
更新
请看下面的执行输出:
create or replace procedure 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) {
result = 'Error: ' + err;
snowflake.execute({sqlText:`ROLLBACK;`});
return result;
}
$$;
call PROC_TEST('insert into schema.proc_test_final1 select id, name, sal from schema.proc_test_src');
+-----------------------------------------------------------+
| PROC_TEST |
|-----------------------------------------------------------|
| Error: SQL compilation error: |
| Schema 'ERICLIN.SCHEMA' does not exist or not authorized. |
+-----------------------------------------------------------+
如果没有 ROLLBACK 调用,它会产生与您的错误相同的错误:
create or replace procedure 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) {
result = 'Error: ' + err;
return result;
}
$$;
call PROC_TEST('insert into schema.proc_test_final1 select id, name, sal from schema.proc_test_src');
090232 (25000): Stored procedure execution error: Scoped transaction started in stored procedure is incomplete and it was rolled back.