[英]Exit the Stored Procedure and RAISE error in Snowflake Store Procedure like BREAK or RAISERROR in sql server
我有一個執行多個查詢的存儲過程,對於每個查詢,我有一個 try 和 Catch 塊,如下所示。 如果有錯誤,我捕獲並插入到日志表中。
但是,無論遇到錯誤,我還需要 BREAK 並退出該步驟。 例如,如果我在第一個 try/catch 中有錯誤,它不應該執行第二個查詢並以 ERROR 退出。
代碼:
CREATE OR REPLACE PROCEDURE DIM_TABLES_REFRESH()
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
var DB_SCHEMA = 'DB_DEV.DMS';
try {
/***** Refresh DIM table DIM_ACT_REVCODE_HIER ****/
var truncate_1 =` TRUNCATE TABLE ${DB_SCHEMA}.DIM_ACT_REVCODE `;
snowflake.execute({sqlText: truncate_1, binds: [DB_SCHEMA]});
var populate_1 = `INSERT INTO ${DB_SCHEMA}.DIM_ACT_REVCODE
(
ACT_REVCODE_HIER_KEY
,REV_CODE
,REV_CODE_DESC
)
SELECT
ROW_NUMBER() OVER ( ORDER BY REV_CODE ) AS ACT_REVCODE_HIER_KEY
,REV_CODE
,REV_CODE_DESC
FROM ${DB_SCHEMA}.OBIEE_ACT_REVCODE`;
snowflake.execute({sqlText: populate_1, binds: [DB_SCHEMA]});
var insert_status_sp1=`INSERT INTO STATS_QUERY_LOAD_STATUS_LOG values (Current_TIMESTAMP(),1,'ACT_REVCODE','Success','');`
var exec_sp1_status = snowflake.createStatement({sqlText: insert_status_sp1}).execute();
exec_sp1_status.next();
var exec_status='Success';
}
catch (err) {
exec_status =err;
if (exec_status!='Success') {
var insert_status_sp1=`INSERT INTO STATS_QUERY_LOAD_STATUS_LOG values (Current_TIMESTAMP(),1,'ACT_REVCODE','Failed',:1);`
var exec_sp1_status = snowflake.createStatement({sqlText: insert_status_sp1,binds:[err.message]}).execute();
exec_sp1_status.next();
}
}
try {
/***** Refresh DIM table ACTIVITY_HIER ****/
var truncate_2 =` TRUNCATE TABLE ${DB_SCHEMA}.ACTIVITY_HIER `;
snowflake.execute({sqlText: truncate_2, binds: [DB_SCHEMA]});
var populate_2 = `INSERT INTO ${DB_SCHEMA}.ACTIVITY_HIER
(
ACTIVITY_HIER_KEY
,ACTIVITY_CD
,ACTIVITY_DESC
,ACTIVITY_CD
)
SELECT
ROW_NUMBER() OVER ( ORDER BY ACTIVITY_CD ,ORG_CODE ) AS ACTIVITY_HIER_KEY
,ACTIVITY_CD
,ACTIVITY_DESC
,ACTIVITY_CD
FROM ${DB_SCHEMA}.OBIEE_ACTIVITY_HIER`;
snowflake.execute({sqlText: populate_2, binds: [DB_SCHEMA]});
var insert_status_sp1=`INSERT INTO STATS_QUERY_LOAD_STATUS_LOG values (Current_TIMESTAMP(),2,'ACTIVITY_HIER','Success','');`
var exec_sp1_status = snowflake.createStatement({sqlText: insert_status_sp1}).execute();
exec_sp1_status.next();
var exec_status='Success';
}
catch (err) {
exec_status =err;
if (exec_status!='Success') {
var insert_status_sp1=`INSERT INTO STATS_QUERY_LOAD_STATUS_LOG values (Current_TIMESTAMP(),2,'ACTIVITY_HIER','Failed',:1);`
var exec_sp1_status = snowflake.createStatement({sqlText: insert_status_sp1,binds:[err.message]}).execute();
exec_sp1_status.next();
}
}
return 'Success';
$$;
CALL DIM_TABLES_REFRESH() ;
我們可以使用如下所示的 THROW 語句通過報錯來停止和退出。
例如拋出錯誤;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.