문 취소하기¶
문을 취소하기 위해 권장되는 방법은 쿼리가 실행 중인 애플리케이션의 인터페이스(예: Snowflake 웹 인터페이스의 워크시트)를 사용하거나 Snowflake ODBC 또는 JDBC 드라이버에서 제공되는 취소 API를 사용하는 것입니다. 그러나 일부 경우에는 SQL을 사용하여 쿼리를 취소해야 합니다.
Snowflake는 SQL을 사용하여 실행 중/활성 문을 취소할 수 있도록 다음 함수를 지원합니다.
예¶
다음 Java 샘플 코드에서는 SYSTEM$CANCEL_ALL_QUERIES 및 다른 Snowflake 함수를 사용하여 5초 후에 현재 세션에서 실행 중인 문을 취소합니다.
샘플 코드에서는 우선 CURRENT_SESSION 에 SQL 명령을 실행하여 세션 식별자를 얻습니다.
그리고 5초 후에 실행될 작업을 생성합니다. 이 작업에서는 세션 식별자를 SYSTEM$CANCEL_ALL_QUERIES에 대한 매개 변수로 사용합니다.
그리고 GENERATOR 테이블 함수를 사용하여 장기 실행 문을 실행하여 120초 동안 행을 생성합니다.
public void testCancelQuery() throws IOException, SQLException
{
Statement statement = null;
ResultSet resultSet = null;
ResultSetMetaData resultSetMetaData = null;
final Connection connection = getConnection(true);
try
{
// Get the current session identifier
Statement getSessionIdStmt = connection.createStatement();
resultSet = getSessionIdStmt.executeQuery("SELECT current_session()");
resultSetMetaData = resultSet.getMetaData();
assertTrue(resultSet.next());
final int sessionId = resultSet.getInt(1);
// Use Timer to cancel all queries of session in 5 seconds
Timer timer = new Timer();
timer.schedule( new TimerTask()
{
@Override
public void run()
{
try
{
// Cancel all queries on session
PreparedStatement cancelAll;
cancelAll = connection.prepareStatement(
"call system$cancel_all_queries(?)");
// bind the session identifier as first argument
cancelAll.setInt(1, sessionId);
cancelAll.executeQuery();
}
catch (SQLException ex)
{
logger.log(Level.SEVERE, "Cancel failed with exception {}", ex);
}
}
}, 5000);
// Use the internal row generator to execute a query for 120 seconds
statement = connection.createStatement();
resultSet = statement.executeQuery(
"SELECT count(*) FROM TABLE(generator(timeLimit => 120))");
resultSetMetaData = resultSet.getMetaData();
statement.close();
}
catch (SQLException ex)
{
// assert the sqlstate is what we expect (QUERY CANCELLED)
assertEquals("sqlstate mismatch",
SqlState.QUERY_CANCELED, ex.getSQLState());
}
catch (Throwable ex)
{
logger.log(Level.SEVERE, "Test failed with exception: ", ex);
}
finally
{
if (resultSet != null)
resultSet.close();
if (statement != null)
statement.close();
// close connection
if (connection != null)
connection.close();
}
}