SQL 문의 영향을 받는 행 수 확인

DML 명령 이 실행된 후(TRUNCATE TABLE 명령 제외), Snowflake Scripting은 다음 전역 변수를 설정합니다. 이러한 변수를 사용하여 마지막 DML 문이 어떤 행에 영향을 미쳤는지, 또는 쿼리에서 반환된 행 수를 확인할 수 있습니다.

변수

설명

ACTIVITY_COUNT

마지막 DML 문의 영향을 받은 행 수 또는 마지막 SELECT 쿼리에서 반환된 행 수입니다. 각 문 실행 후에 설정됩니다.

SQLROWCOUNT

마지막 DML 문의 영향을 받는 행 수입니다.

이것은 JavaScript 저장 프로시저의 getNumRowsAffected() 와 동일합니다.

SQLFOUND

마지막 DML 문이 하나 이상의 행에 영향을 미쳤으면 true 입니다.

SQLNOTFOUND

마지막 DML 문이 0 행에 영향을 미쳤으면 true 입니다.

참고

2025_01 동작 변경 번들 은 이러한 변수의 동작을 변경합니다. 번들을 활성화하면 변수는 Snowflake Scripting 블록 또는 저장 프로시저에서 마지막 DML 문 다음에 DML 문이 아닌 문이 실행될 때 NULL 을 반환합니다. 번들은 기본적으로 활성화되어 있습니다. 동작 변경에 대한 자세한 내용은 Snowflake Scripting: 전역 변수에 대한 변경 사항 섹션을 참조하십시오.

번들이 비활성화되어 있는 경우 다음 문을 실행하여 계정에서 활성화 할 수 있습니다.

SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');

번들을 비활성화하려면 다음 문을 실행하십시오.

SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2025_01');

이 섹션의 예제에서는 다음 테이블을 사용합니다.

CREATE OR REPLACE TABLE my_values (value NUMBER);

다음 예에서는 SQLROWCOUNT 변수를 사용하여 마지막 DML 문(INSERT 문)의 영향을 받는 행 수를 반환합니다.

BEGIN
  LET sql_row_count_var INT := 0;
  INSERT INTO my_values VALUES (1), (2), (3);
  sql_row_count_var := SQLROWCOUNT;
  SELECT * from my_values;
  RETURN sql_row_count_var;
END;

참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하세요(Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector 참조).

EXECUTE IMMEDIATE $$
BEGIN
  LET sql_row_count_var INT := 0;
  INSERT INTO my_values VALUES (1), (2), (3);
  sql_row_count_var := SQLROWCOUNT;
  SELECT * from my_values;
  RETURN sql_row_count_var;
END;
$$;
+-----------------+
| anonymous block |
|-----------------|
|               3 |
+-----------------+

다음 예에서는 SQLFOUNDSQLNOTFOUND 변수를 사용하여, 마지막 DML 문(UPDATE 문)의 영향을 받는 행 수를 반환합니다.

BEGIN
  LET sql_row_count_var INT := 0;
  LET sql_found_var BOOLEAN := NULL;
  LET sql_notfound_var BOOLEAN := NULL;
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
    sql_row_count_var := SQLROWCOUNT;
    sql_found_var := SQLFOUND;
    sql_notfound_var := SQLNOTFOUND;
  END IF;
  SELECT * from my_values;
  IF (sql_found_var = true) THEN
    RETURN 'Updated ' || sql_row_count_var || ' rows.';
  ELSEIF (sql_notfound_var = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
END;

참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하세요(Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector 참조).

EXECUTE IMMEDIATE $$
BEGIN
  LET sql_row_count_var INT := 0;
  LET sql_found_var BOOLEAN := NULL;
  LET sql_notfound_var BOOLEAN := NULL;
  IF ((SELECT MAX(value) FROM my_values) > 2) THEN
    UPDATE my_values SET value = 4 WHERE value < 3;
    sql_row_count_var := SQLROWCOUNT;
    sql_found_var := SQLFOUND;
    sql_notfound_var := SQLNOTFOUND;
  END IF;
  SELECT * from my_values;
  IF (sql_found_var = true) THEN
    RETURN 'Updated ' || sql_row_count_var || ' rows.';
  ELSEIF (sql_notfound_var = true) THEN
    RETURN 'No rows updated.';
  ELSE
    RETURN 'No DML statements executed.';
  END IF;
END;
$$;

익명 블록이 실행되면 UPDATE 문이 두 행을 업데이트하므로 SQLFOUND 변수는 true 입니다.

+-----------------+
| anonymous block |
|-----------------|
| Updated 2 rows. |
+-----------------+

테이블을 쿼리하여 현재 값을 확인합니다.

SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
|     4 |
|     4 |
|     3 |
+-------+

동일한 익명 블록을 다시 실행하면 다음과 같은 결과가 나타납니다.

  • UPDATE 문은 테이블에 2 보다 큰 값이 있기 때문에 실행됩니다. 즉, IF 조건이 충족됩니다.

  • SQLNOTFOUND 변수는 행이 업데이트되지 않으므로 true 입니다. UPDATE 문은 테이블의 값 중 3 (WHERE 절에 지정됨)보다 작은 값이 없기 때문에 행을 업데이트하지 않습니다.

쿼리에서 반환되는 출력은 다음과 같습니다.

+------------------+
| anonymous block  |
|------------------|
| No rows updated. |
+------------------+

이제 테이블을 업데이트하여 모든 값을 1 로 설정합니다.

UPDATE my_values SET value = 1;

SELECT * FROM my_values;
+-------+
| VALUE |
|-------|
|     1 |
|     1 |
|     1 |
+-------+

동일한 익명 블록을 다시 실행하면 테이블의 값 중 2 보다 큰 값이 없기 때문에 UPDATE 문이 실행되지 않습니다. 즉, IF 조건이 충족되지 않으므로 UPDATE 문이 실행되지 않습니다.

+-----------------------------+
| anonymous block             |
|-----------------------------|
| No DML statements executed. |
+-----------------------------+

ACTIVITY_COUNT 예

SQLROWCOUNT 와 달리, ACTIVITY_COUNT 변수는 SELECT 쿼리를 포함하여 각 문 실행 후에 설정됩니다. 이는 DML 작업의 영향을 받은 행 수 및 쿼리에서 반환된 행 수 모두를 추적하는 데 유용합니다.

다음 예제에서는 INSERT 문 및 SELECT 쿼리 실행 후 ACTIVITY_COUNT 를 보여줍니다.

BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  LET insert_count INT := ACTIVITY_COUNT;
  SELECT * FROM my_values WHERE value > 1;
  LET select_count INT := ACTIVITY_COUNT;
  RETURN 'Inserted ' || insert_count || ' rows, query returned ' || select_count || ' rows.';
END;

참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하세요(Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector 참조).

EXECUTE IMMEDIATE $$
BEGIN
  INSERT INTO my_values VALUES (1), (2), (3);
  LET insert_count INT := ACTIVITY_COUNT;
  SELECT * FROM my_values WHERE value > 1;
  LET select_count INT := ACTIVITY_COUNT;
  RETURN 'Inserted ' || insert_count || ' rows, query returned ' || select_count || ' rows.';
END;
$$;

INSERT 실행 후 ACTIVITY_COUNT3 입니다(3개의 행이 삽입됨). SELECT 실행 후 ACTIVITY_COUNT2``입니다(두 행이 ``WHERE value > 1 조건과 일치함).

+-------------------------------------------+
| anonymous block                           |
|-------------------------------------------|
| Inserted 3 rows, query returned 2 rows.   |
+-------------------------------------------+