저장 프로시저 개요¶
SQL을 실행하는 프로시저 코드로 시스템을 확장하는 저장 프로시저를 작성할 수 있습니다. 저장 프로시저에서 프로그래밍 방식 구문을 사용하여 분기 및 루핑을 수행할 수 있습니다. 일단 저장 프로시저를 생성하고 나면 여러 번 재사용할 수 있습니다.
지원되는 언어 중 하나로 프로시저의 논리(처리기)를 작성합니다. 처리기가 있으면 CREATE PROCEDURE 명령으로 프로시저를 생성 한 다음, CALL 문으로 프로시저를 호출 할 수 있습니다.
저장 프로시저에서 단일 값 또는 (처리기 언어에서 지원되는 경우) 테이블 형식 데이터를 반환할 수 있습니다. 지원되는 반환 유형에 대한 자세한 내용은 CREATE PROCEDURE 섹션을 참조하십시오.
참고
익명 프로시저를 만들기도 하고 호출도 하려면 CALL(익명 프로시저 사용) 를 사용하십시오. 익명 프로시저를 만들고 호출하는 데는 CREATE PROCEDURE 스키마 권한이 있는 역할이 필요하지 않습니다.
참고
저장 프로시저는 UDF와 같지만, 두 가지 중요한 면에서 다릅니다. 자세한 내용은 저장 프로시저를 작성할지 사용자 정의 함수를 작성할지 선택하기 섹션을 참조하십시오.
이 항목의 내용:
저장 프로시저란 무엇입니까?¶
저장 프로시저에는 SQL에서 호출할 수 있도록 작성한 논리가 포함됩니다. 저장 프로시저의 논리는 일반적으로 SQL 문을 실행하여 데이터베이스 작업을 수행합니다.
저장 프로시저를 사용하여 다음을 수행할 수도 있습니다.
SQL 문을 동적으로 만들고 실행할 수 있습니다.
프로시저를 실행하는 역할의 권한이 아니라 프로시저를 소유한 역할의 권한으로 코드를 작성할 수 있습니다.
이를 통해 저장 프로시저 소유자는 지정된 작업을 수행할 수 없는 사용자에게 작업 수행 권한을 위임할 수 있습니다. 하지만 이러한 소유자 권한 저장 프로시저에는 제한이 있습니다.
저장 프로시저를 사용하여 여러 SQL 문이 필요하고 자주 수행되는 작업을 자동화할 수 있습니다. 예를 들어, 지정된 날짜보다 오래된 데이터를 삭제하여 데이터베이스를 정리하고 싶은 경우를 생각해 보십시오. 여러 DELETE 문을 작성할 수 있으며, 각각의 명이 특정한 테이블에서 데이터를 삭제합니다. 이러한 모든 문을 단일 저장 프로시저에 넣고 마감 날짜를 지정하는 매개 변수를 전달할 수 있습니다. 그런 다음, 그냥 이 프로시저를 호출하여 데이터베이스를 정리할 수 있습니다. 데이터베이스가 변경될 때 프로시저를 업데이트하여 추가 테이블을 정리할 수 있습니다. 정리 명령을 사용하는 사용자가 여러 명인 경우 모든 테이블 이름을 기억하고 각 테이블을 개별적으로 정리하는 게 아니라 하나의 프로시저를 호출해 정리할 수 있습니다.
저장 프로시저 예제¶
다음 예제의 코드는 run
이라는 Python 처리기를 사용하여 myproc
이라는 저장 프로시저를 생성합니다.
create or replace procedure myproc(from_table string, to_table string, count int)
returns string
language python
runtime_version = '3.8'
packages = ('snowflake-snowpark-python')
handler = 'run'
as
$$
def run(session, from_table, to_table, count):
session.table(from_table).limit(count).write.save_as_table(to_table)
return "SUCCESS"
$$;
다음 예제의 코드는 저장 프로시저 myproc
을 호출합니다.
CALL myproc('table_a', 'table_b', 5);
지원되는 언어¶
여러 프로그래밍 언어 중 하나로 프로시저의 처리기(해당 논리)를 작성합니다. 각 언어를 사용하여 언어 및 해당 런타임 환경의 제약 조건 내에서 데이터를 조작할 수 있습니다. 처리기 언어에 관계없이, SQL을 사용하여 처리기 및 처리기 언어를 지정하는 것과 동일한 방식으로 프로시저 자체를 생성합니다.
다음 언어 중 하나로 처리기를 작성할 수 있습니다.
언어 |
개발자 가이드 |
---|---|
Java(Snowpark API 사용) |
|
JavaScript |
|
Python(Snowpark API 사용) |
|
Scala(Snowpark API 사용) |
|
Snowflake Scripting(SQL) |
언어 선택¶
여러 프로그래밍 언어 중 하나로 프로시저의 처리기(해당 논리)를 작성합니다. 각 언어를 사용하여 언어 및 해당 런타임 환경의 제약 조건 내에서 데이터를 조작할 수 있습니다.
다음과 같은 경우 특정 언어를 선택할 수 있습니다.
이미 해당 언어로 된 코드가 있는 경우.
예를 들어 처리기로 작동할 Java 메서드가 이미 있고 메서드의 오브젝트가 .jar 파일에 있는 경우 .jar을 스테이지에 복사하고 처리기를 클래스 및 메서드로 지정한 다음 언어를 Java로 지정할 수 있습니다.
이 언어에는 다른 언어에는 없는 기능이 있습니다.
이 언어에 수행해야 할 처리 작업의 수행에 도움이 될 수 있는 라이브러리가 있습니다.
언어를 선택할 때 지원되는 처리기 위치도 고려하십시오. 일부 언어에서는 스테이지에서 처리기 참조를 지원하지 않습니다(대신 처리기 코드는 인라인이어야 함). 자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
언어 |
처리기 위치 |
---|---|
Java |
인라인 또는 스테이징됨 |
JavaScript |
인라인 |
Python |
인라인 또는 스테이징됨 |
Scala |
인라인 또는 스테이징됨 |
Snowflake Scripting |
인라인 |
개발자 가이드¶
지침 및 제약 조건¶
- 팁:
저장 프로시저 작성에 대한 팁은 저장 프로시저 작업하기 섹션을 참조하십시오.
- Snowflake 제약 조건:
Snowflake 제약 조건 내에서 개발하여 Snowflake 환경 내에서 안정성을 보장할 수 있습니다. 자세한 내용은 Snowflake에서 적용한 제약 조건 내에서 유지되는 처리기 설계하기 섹션을 참조하십시오.
- 명명:
다른 프로시저와 충돌하지 않도록 프로시저 이름을 지정해야 합니다. 자세한 내용은 프로시저와 UDF의 명명 및 오버로딩 섹션을 참조하십시오.
- 인자:
저장 프로시저에 대한 인자를 지정하고 선택적인 인자를 표시합니다. 자세한 내용은 UDF 및 저장 프로시저에 대한 인자 정의하기 섹션을 참조하십시오.
- 데이터 타입 매핑:
각 처리기 언어에 대해 언어의 데이터 타입과 인자 및 반환 값에 사용되는 SQL 유형 간에 별도의 매핑 세트가 있습니다. 각 언어의 매핑에 대한 자세한 내용은 SQL 및 처리기 언어 간의 데이터 타입 매핑 섹션을 참조하십시오.
처리기 작성¶
- 처리기 언어:
처리기 작성에 대한 언어별 콘텐츠는 지원되는 언어 섹션을 참조하십시오.
- 외부 네트워크 액세스:
외부 네트워크 액세스 로 외부 네트워크 위치에 액세스할 수 있습니다. Snowflake 외부의 특정 네트워크 위치에 대한 보안 액세스를 생성한 다음, 처리기 코드 내에서 해당 액세스를 사용할 수 있습니다.
- 로깅 및 추적:
로그 메시지와 추적 이벤트를 캡처하고 나중에 쿼리할 수 있는 데이터베이스에 데이터를 저장하여 코드 활동을 기록할 수 있습니다.
보안¶
호출자 권한 또는 소유자 권한으로 저장 프로시저를 실행하도록 선택하는지 여부는 액세스 권한이 있는 정보와 수행하도록 허용될 수 있는 작업에 영향을 미칠 수 있습니다. 자세한 내용은 Understanding Caller’s Rights and Owner’s Rights Stored Procedures 섹션을 참조하십시오.
저장 프로시저는 UDF(사용자 정의 함수)와 특정 보안 문제를 공유합니다. 자세한 내용은 다음을 참조하십시오.
UDF 및 프로시저의 보안 모범 사례 에 설명된 모범 사례에 따라 프로시저의 처리기 코드가 안전하게 실행되도록 도울 수 있습니다.
민감한 정보에 액세스하면 안 되는 사용자가 민감한 정보를 볼 수 없도록 되어 있는지 확인합니다. 자세한 내용은 Secure UDF와 저장 프로시저로 민감한 정보 보호하기 섹션을 참조하십시오.
처리기 코드 배포¶
프로시저를 생성할 때 프로시저의 논리를 구현하는 처리기를 CREATE PROCEDURE 문으로 인라인 코드로 지정하거나 스테이지에 패키징 및 복사되는 컴파일된 코드와 같이 문 외부의 코드로 지정할 수 있습니다.
자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
프로시저 생성 및 호출하기¶
SQL을 사용하여 프로시저를 생성하고 호출합니다.
처리기 코드를 작성했으면 CREATE PROCEDURE 문을 실행하고 프로시저의 처리기를 지정하여 저장 프로시저를 생성할 수 있습니다. 자세한 내용은 저장 프로시저 만들기 섹션을 참조하십시오.
프로시저를 호출하려면 프로시저를 지정하는 SQL CALL 문을 실행하십시오. 자세한 내용은 저장 프로시저 호출하기 섹션을 참조하십시오.
한 번만 실행되고 삭제되는 임시 프로시저를 만들려면 WITH…CALL을 사용하십시오. 자세한 내용은 CALL(익명 프로시저 사용) 섹션을 참조하십시오.