雪花中的异步存储过程

时间:2021-03-20 08:06:15

标签: snowflake-cloud-data-platform

我需要在雪花中使用必须以异步模式执行的存储过程。所以如果调用的是存储过程,它应该立即返回 queryid 并关闭会话。实际执行应该独立发生。我尝试实现调用异步存储过程但似乎不起作用的包装器存储过程。

1 个答案:

答案 0 :(得分:0)

您可以从 Java 应用程序异步执行存储过程:

https://docs.snowflake.com/en/user-guide/jdbc-using.html#examples-of-asynchronous-queries

我创建了一个简单的存储过程,它等待 5 秒然后返回“成功”。以下是调用存储过程并获取查询 ID 的示例 Java 代码(当存储过程仍在工作时):

public static void main(String[] args) throws SQLException, InterruptedException {

    try (Connection con = getConnection()) {

        try (var statement = con.createStatement()) {

            var sql_command = "CALL TEST_SP()";
            var resultSet = statement.unwrap(SnowflakeStatement.class).executeAsyncQuery(sql_command);
            var queryID = resultSet.unwrap(SnowflakeResultSet.class).getQueryID();


            System.out.printf("Calling TEST_SP() - Query ID is %s%n", queryID);
            var queryStatus = resultSet.unwrap(SnowflakeResultSet.class).getStatus();
            while (queryStatus == QueryStatus.RUNNING || queryStatus == QueryStatus.RESUMING_WAREHOUSE) {
                Thread.sleep(1000); // 1000 milliseconds.
                System.out.printf( "Waiting for 1 second...\n");
                queryStatus = resultSet.unwrap(SnowflakeResultSet.class).getStatus();

            }
            if (resultSet.next()) System.out.println(resultSet.getString(1));
        }
    }
}

输出:

Calling TEST_SP() - Query ID is 019b08ac-32c3-3514-0000-b4550004911a
Waiting for 1 second...
Waiting for 1 second...
Waiting for 1 second...
Waiting for 1 second...
Waiting for 1 second...
Success

当然,你不需要等到存储过程结束,这段代码只是展示了存储过程是如何异步执行的。