저장 프로시저 개요

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"
$$;
Copy

다음 예제의 코드는 저장 프로시저 myproc 을 호출합니다.

CALL myproc('table_a', 'table_b', 5);
Copy

지원되는 언어

여러 프로그래밍 언어 중 하나로 프로시저의 처리기(해당 논리)를 작성합니다. 각 언어를 사용하여 언어 및 해당 런타임 환경의 제약 조건 내에서 데이터를 조작할 수 있습니다. 처리기 언어에 관계없이, SQL을 사용하여 처리기 및 처리기 언어를 지정하는 것과 동일한 방식으로 프로시저 자체를 생성합니다.

다음 언어 중 하나로 처리기를 작성할 수 있습니다.

언어

개발자 가이드

Java(Snowpark API 사용)

Java로 저장 프로시저 작성하기

JavaScript

JavaScript로 저장 프로시저 작성하기

Python(Snowpark API 사용)

Python으로 저장 프로시저 작성하기

Scala(Snowpark API 사용)

Scala로 저장 프로시저 작성하기

Snowflake Scripting(SQL)

Snowflake Scripting에서 저장 프로시저 작성하기

언어 선택

여러 프로그래밍 언어 중 하나로 프로시저의 처리기(해당 논리)를 작성합니다. 각 언어를 사용하여 언어 및 해당 런타임 환경의 제약 조건 내에서 데이터를 조작할 수 있습니다.

다음과 같은 경우 특정 언어를 선택할 수 있습니다.

  • 이미 해당 언어로 된 코드가 있는 경우.

    예를 들어 처리기로 작동할 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(사용자 정의 함수)와 특정 보안 문제를 공유합니다. 자세한 내용은 다음을 참조하십시오.

처리기 코드 배포

프로시저를 생성할 때 프로시저의 논리를 구현하는 처리기를 CREATE PROCEDURE 문으로 인라인 코드로 지정하거나 스테이지에 패키징 및 복사되는 컴파일된 코드와 같이 문 외부의 코드로 지정할 수 있습니다.

자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.

프로시저 생성 및 호출하기

SQL을 사용하여 프로시저를 생성하고 호출합니다.

  • 처리기 코드를 작성했으면 CREATE PROCEDURE 문을 실행하고 프로시저의 처리기를 지정하여 저장 프로시저를 생성할 수 있습니다. 자세한 내용은 저장 프로시저 만들기 섹션을 참조하십시오.

  • 프로시저를 호출하려면 프로시저를 지정하는 SQL CALL 문을 실행하십시오. 자세한 내용은 저장 프로시저 호출하기 섹션을 참조하십시오.

  • 한 번만 실행되고 삭제되는 임시 프로시저를 만들려면 WITH…CALL을 사용하십시오. 자세한 내용은 CALL(익명 프로시저 사용) 섹션을 참조하십시오.