DML 명령의 영향을 받는 행 수 확인하기¶
DML 명령 이 실행된 후(TRUNCATE TABLE 명령 제외) Snowflake Scripting은 다음과 같은 전역 변수를 설정합니다. 이 변수를 사용하면 마지막 DML 문이 행에 영향을 미쳤는지 확인할 수 있습니다.
변수 |
설명 |
---|---|
|
마지막 DML 문의 영향을 받는 행 수입니다. 이것은 JavaScript 저장 프로시저의 |
|
마지막 DML 문이 하나 이상의 행에 영향을 미쳤으면 |
|
마지막 DML 문이 0 행에 영향을 미쳤으면 |
이 섹션의 예제에서는 다음 테이블을 사용합니다.
CREATE OR REPLACE TABLE my_values (value NUMBER);
다음 예에서는 SQLROWCOUNT
변수를 사용하여 마지막 DML 문(INSERT 문)의 영향을 받는 행 수를 반환합니다. SELECT 문은 DML 문이 아니며 SQLROWCOUNT
변수에 영향을 미치지 않습니다.
BEGIN
INSERT INTO my_values VALUES (1), (2), (3);
SELECT * from my_values;
RETURN SQLROWCOUNT;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
BEGIN
INSERT INTO my_values VALUES (1), (2), (3);
SELECT * from my_values;
RETURN SQLROWCOUNT;
END;
$$;
+-----------------+
| anonymous block |
|-----------------|
| 3 |
+-----------------+
다음 예에서는 SQLFOUND
및 SQLNOTFOUND
변수를 사용하여, 마지막 DML 문(UPDATE 문)의 영향을 받는 행 수를 반환합니다. 앞의 예와 마찬가지로 SELECT 문은 SQLFOUND
및 SQLNOTFOUND
변수에 영향을 주지 않습니다.
BEGIN
IF ((SELECT MAX(value) FROM my_values) > 2) THEN
UPDATE my_values SET value = 4 WHERE value < 3;
END IF;
SELECT * from my_values;
IF (SQLFOUND = true) THEN
RETURN 'Updated ' || SQLROWCOUNT || ' rows.';
ELSEIF (SQLNOTFOUND = true) THEN
RETURN 'No rows updated.';
ELSE
RETURN 'No DML statements executed.';
END IF;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
BEGIN
IF ((SELECT MAX(value) FROM my_values) > 2) THEN
UPDATE my_values SET value = 4 WHERE value < 3;
END IF;
SELECT * from my_values;
IF (SQLFOUND = true) THEN
RETURN 'Updated ' || SQLROWCOUNT || ' rows.';
ELSEIF (SQLNOTFOUND = 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. |
+-----------------------------+