我需要在雪花中使用必须以异步模式执行的存储过程。所以如果调用的是存储过程,它应该立即返回 queryid 并关闭会话。实际执行应该独立发生。我尝试实现调用异步存储过程但似乎不起作用的包装器存储过程。
答案 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
当然,你不需要等到存储过程结束,这段代码只是展示了存储过程是如何异步执行的。