저장 프로시저에서 선택하기

일부 저장 프로시저는 테이블 형식의 데이터를 반환합니다. 이 테이블 형식의 데이터를 선택하고 조작하려면 SELECT 문의 FROM 절에서 이러한 저장 프로시저를 호출하면 됩니다.

TABLE 키워드가 포함된 SELECT 문을 실행합니다.

저장 프로시저를 호출할 때 CALL 명령은 생략합니다. 대신 TABLE 키워드를 사용하고 괄호 안에 프로시저의 이름을 지정합니다.

SELECT ... FROM TABLE( <stored_procedure_name>( <arg> [ , <arg> ... ] ) );
Copy

저장 프로시저에서 선택하는 예제

이 예제에서는 다음 테이블의 데이터를 사용합니다.

CREATE OR REPLACE TABLE orders (
  order_id INT,
  u_id VARCHAR,
  order_date DATE,
  order_amount NUMBER(12,2));

INSERT INTO orders VALUES (1, 'user_id_001', current_date, 500.00);
INSERT INTO orders VALUES (2, 'user_id_003', current_date, 225.00);
INSERT INTO orders VALUES (3, 'user_id_001', current_date, 725.00);
INSERT INTO orders VALUES (4, 'user_id_002', current_date, 150.00);
INSERT INTO orders VALUES (5, 'user_id_002', current_date, 900.00);
Copy

다음 저장 프로시저는 사용자 ID를 기준으로 주문 정보를 반환합니다.

CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
  order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
DECLARE
  res RESULTSET;
BEGIN
  res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
  RETURN TABLE(res);
END;
Copy

참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).

CREATE OR REPLACE PROCEDURE find_orders_by_user_id(user_id VARCHAR)
RETURNS TABLE (
  order_id INT, order_date DATE, order_amount NUMBER(12,2)
)
LANGUAGE SQL AS
$$
DECLARE
  res RESULTSET;
BEGIN
  res := (SELECT order_id, order_date, order_amount FROM orders WHERE u_id = :user_id);
  RETURN TABLE(res);
END;
$$
;
Copy

다음 SELECT 문은 저장 프로시저의 결과를 검색합니다.

SELECT * FROM TABLE(find_orders_by_user_id('user_id_001'));
Copy
+----------+------------+--------------+
| ORDER_ID | ORDER_DATE | ORDER_AMOUNT |
|----------+------------+--------------|
|        1 | 2024-08-30 |       500.00 |
|        3 | 2024-08-30 |       725.00 |
+----------+------------+--------------+

저장 프로시저에서 선택하기의 제한 사항

저장 프로시저에서 선택하는 데는 다음과 같은 제한이 적용됩니다.

  • SELECT, SHOW, DESCRIBE 또는 CALL 문을 수행하는 저장 프로시저만 SELECT 문의 FROM 절에 배치할 수 있습니다. DDL 또는 DML 연산자를 사용하여 수정하는 저장 프로시저는 허용되지 않습니다. CALL 문을 발행하는 저장 프로시저의 경우 이러한 제한 사항은 호출되는 저장 프로시저에 적용됩니다.

  • 정적 출력 스키마를 사용하여 테이블 형식의 데이터를 반환하는 저장 프로시저만 SELECT 문의 FROM 절에 배치할 수 있습니다. 출력 열의 이름을 지정하고 입력해야 합니다. 예를 들어, 다음 RETURNS 절이 있는 저장 프로시저가 지원됩니다.

    RETURNS TABLE (col1 INT, col2 STRING)
    
    Copy

    다음 RETURNS 절이 있는 저장 프로시저는 테이블 형식의 데이터를 반환하지 않으므로 지원되지 않습니다.

    RETURNS STRING
    
    Copy

    다음 RETURNS 절이 있는 저장 프로시저는 고정 출력 스키마를 제공하지 않으므로 지원되지 않습니다.

    RETURNS TABLE()
    
    Copy
  • 저장 프로시저는 다음 문 중 하나에서 SELECT 블록의 FROM 절에서 호출되어야 합니다.

  • 저장 프로시저는 SELECT 문 외부에 정의된 CTE 에 대한 참조와 같이 외부 범위에서 상호 연관된 입력 인자를 받을 수 없습니다.

  • 인자에 하위 쿼리가 포함된 경우 해당 하위 쿼리는 WITH 절에 정의된 CTE를 사용할 수 없습니다.

  • 저장 프로시저 호출이 포함된 SELECT 문은 뷰의 본문, 사용자 정의 함수(UDF), 사용자 정의 테이블 함수(UDTF) 또는 행 액세스 정책데이터 마스킹 정책 같은 오브젝트에서는 사용할 수 없습니다.