SQL을 사용하여 만든 저장 프로시저에서 Scala로 표 형식 반환하기¶
테이블 형식으로 데이터를 반환하는 프로시저를 작성할 수 있습니다. 테이블 형식 데이터를 반환하는 프로시저를 작성하려면 다음을 수행하십시오.
CREATE PROCEDURE 문에서 프로시저의 반환 유형으로
TABLE(...)
을 지정합니다.반환된 데이터의 열 이름과 유형 을 알고 있는 경우 이들을 TABLE 매개 변수로 지정할 수 있습니다. 프로시저를 정의할 때 반환된 열을 모르는 경우(예: 런타임에 지정된 경우) TABLE 매개 변수를 생략할 수 있습니다. 그렇게 하면 프로시저의 반환 값 열이 해당 처리기에서 반환된 데이터 프레임의 열에서 변환됩니다. 열 데이터 타입은 SQL-Scala 데이터 타입 매핑 에 지정된 매핑에 따라 SQL 로 변환됩니다.
Snowpark 데이터 프레임에서 테이블 형식 결과를 반환하도록 처리기를 작성합니다.
데이터 프레임에 대한 자세한 내용은 Snowpark Scala에서 DataFrame 작업하기 섹션을 참조하십시오.
참고
다음 중 하나가 충족되는 경우 프로시저는 런타임 시 오류를 생성합니다.
TABLE 을 반환 유형으로 선언하지만 처리기는 데이터 프레임을 반환하지 않습니다.
처리기는 데이터 프레임을 반환하지만 프로시저는 TABLE 을 반환 유형으로 선언하지 않습니다.
예¶
이 섹션의 예에서는 열이 문자열과 일치하는 행을 필터링하는 프로시저에서 테이블 형식 값을 반환하는 방법을 보여줍니다.
데이터 정의하기¶
다음은 직원 테이블을 생성하는 코드 예제입니다.
CREATE OR REPLACE TABLE employees(id NUMBER, name VARCHAR, role VARCHAR);
INSERT INTO employees (id, name, role) VALUES (1, 'Alice', 'op'), (2, 'Bob', 'dev'), (3, 'Cindy', 'dev');
행을 필터링하는 프로시저 선언하기¶
다음 두 예제의 코드로 테이블 이름과 역할을 인자로 취하여 역할 열 값이 인자로 지정된 역할과 일치하는 테이블의 행을 반환하는 저장 프로시저를 생성할 수 있습니다.
반환 열 이름 및 유형 지정하기¶
이 예에서는 RETURNS TABLE()
문에 열 이름과 유형을 지정합니다.
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'Filter.filterByRole'
AS
$$
import com.snowflake.snowpark.functions._
import com.snowflake.snowpark._
object Filter {
def filterByRole(session: Session, tableName: String, role: String): DataFrame = {
val table = session.table(tableName)
val filteredRows = table.filter(col("role") === role)
return filteredRows
}
}
$$;
참고
현재, RETURNS TABLE(...)
절에서는 GEOGRAPHY 를 열 유형으로 지정할 수 없습니다. 이는 저장 프로시저를 생성하든 익명 프로시저를 생성하든 관계없이 적용됩니다.
CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
RETURNS TABLE(g GEOGRAPHY)
...
WITH test_return_geography_table_1() AS PROCEDURE
RETURNS TABLE(g GEOGRAPHY)
...
CALL test_return_geography_table_1();
GEOGRAPHY를 열 유형으로 지정하려고 할 경우 저장 프로시저를 호출하면 오류가 발생합니다.
Stored procedure execution error: data type of returned table does not match expected returned table type
이 문제를 해결하려면 RETURNS TABLE()
에서 열 인자와 유형을 생략하면 됩니다.
CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
RETURNS TABLE()
...
WITH test_return_geography_table_1() AS PROCEDURE
RETURNS TABLE()
...
CALL test_return_geography_table_1();
반환 열 이름 및 유형 생략하기¶
다음 예제의 코드에서는 처리기의 반환 값에 있는 열에서 반환 값 열 이름 및 유형을 추정할 수 있도록 하는 프로시저를 선언합니다. 이 코드는 RETURNS TABLE()
문에서 열 이름과 유형을 생략합니다.
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'Filter.filterByRole'
AS
$$
import com.snowflake.snowpark.functions._
import com.snowflake.snowpark._
object Filter {
def filterByRole(session: Session, tableName: String, role: String): DataFrame = {
val table = session.table(tableName)
val filteredRows = table.filter(col("role") === role)
return filteredRows
}
}
$$;
프로시저 호출하기¶
다음 예에서는 저장 프로시저를 호출합니다.
CALL filter_by_role('employees', 'dev');
프로시저를 호출하면 다음 출력이 생성됩니다.
+----+-------+------+
| ID | NAME | ROLE |
+----+-------+------+
| 2 | Bob | dev |
| 3 | Cindy | dev |
+----+-------+------+