Майк уже ответил на самое прямое изменение, которое вы можете сделать выше, проверив возвращаемые значения на наличие ошибок по содержанию. Ниже просто добавлен еще один возможный подход.
-
Показано в в некоторых примерах из документации Snowflake , процедура может завершиться с ошибкой вместо явный возврат.
Можно написать базовые процедуры (P1
, P2
, P3
) в таком формате, где бросок автоматически действует как завершение без необходимости перехвата, и сохраняет контекст ошибки для любого прямого или косвенного CALL:
CREATE OR REPLACE PROCEDURE P1()
RETURN VARCHAR LANGUAGUE JAVASCRIPT
AS $$ {
// (… logic …)
if (faultyCondition) {
throw 'p1 failure reason';
}
} $$;
-- Repeat above pattern for (P2, P3, etc.)
Тогда вызывающая родительская процедура может быть написана следующим образом и прекратит выполнение при любой ошибке вместо продолжения:
CREATE OR REPLACE PROCEDURE ORCH_SP()
RETURN VARCHAR LANGUAGUE JAVASCRIPT
AS $$ {
try {
// Note: Add more args / call directly as necessary for real-life use
function run(call_name) {
snowflake.createStatement({ sqlText: `CALL $call_name();` }).execute();
}
run("P1");
run("P2");
run("P3");
// (… other logic …)
} catch (err) {
result = err;
}
return result;
} $$;
Этот шаблон больше соответствует тому, как обработка ошибок обычно реализуется с использованием try-catch и подфункций.