SYSTEM$SET_RETURN_VALUE

SYSTEM$SET_RETURN_VALUE

태스크의 반환 값을 명시적으로 설정하는 시스템 함수예요.

태스크 그래프(task graph)에서 태스크가 이 함수를 호출해 반환 값을 설정할 수 있어요. 이 태스크를 선행 태스크(predecessor task)로 식별하는 다른 태스크(태스크 정의에서 AFTER 키워드 사용)는 SYSTEM$GET_PREDECESSOR_RETURN_VALUE를 사용해 선행 태스크가 설정한 반환 값을 검색할 수 있어요.

출처: Snowflake SQL Reference

본문

Syntax

SYSTEM$SET_RETURN_VALUE( '<string_expression>' )

string_expression 인자의 값은 문자열 리터럴 또는 변수일 수 있어요; 예: SYSTEM$SET_RETURN_VALUE(:VARIABLE).

Arguments

string_expression:

반환 값으로 설정할 문자열이에요. 문자열 크기는 UTF8로 인코딩했을 때 10 kB 이하여야 해요.

Examples

반환 값을 설정하는 태스크를 만들고, 선행 태스크가 완료된 뒤 실행되는 두 번째 자식 태스크를 만들어요. 자식 태스크는 선행 태스크가 설정한 반환 값(SYSTEM$GET_PREDECESSOR_RETURN_VALUE 호출)을 검색해 테이블 행에 삽입해요:

-- Create a table to store the return values.
CREATE OR REPLACE TABLE return_values_table (str VARCHAR);
-- Create a task that sets the return value for the task.
CREATE TASK set_return_value_task WAREHOUSE = return_task_wh SCHEDULE = '1 MINUTE' AS
CALL SYSTEM$SET_RETURN_VALUE('The quick brown fox jumps over the lazy dog');
-- Create a task that identifies the first task as the predecessor task and retrieves the return value set for that task.
CREATE TASK get_return_value_task WAREHOUSE = return_task_wh AFTER set_return_value_task AS
INSERT INTO return_values_table VALUES(SYSTEM$GET_PREDECESSOR_RETURN_VALUE());
-- Note that if there are multiple predecessor tasks that are enabled, you must specify the name of the task to retrieve the return value for that task.
CREATE TASK get_return_value_by_pred_task WAREHOUSE = return_task_wh AFTER set_return_value_task AS
INSERT INTO return_values_table VALUES(SYSTEM$GET_PREDECESSOR_RETURN_VALUE('get_return_value_task'));
-- Resume task (using ALTER TASK ... RESUME).
-- Wait for task to run on schedule.
SELECT DISTINCT(str) FROM return_values_table;
+-----------------------------------------------+
| STR                                           |
+-----------------------------------------------+
| The quick brown fox jumps over the lazy dog   |
+-----------------------------------------------+
SELECT DISTINCT(RETURN_VALUE) FROM TABLE(information_schema.task_history()) WHERE RETURN_VALUE IS NOT NULL;
+-----------------------------------------------+
| RETURN_VALUE                                  |
+-----------------------------------------------+
| The quick brown fox jumps over the lazy dog   |
+-----------------------------------------------+

Example 2: 별도 저장 프로시저를 사용한 호출

첫 번째 예제와 비슷하지만, 별도의 저장 프로시저를 호출해 태스크의 반환 값을 설정하고 검색해요:

-- Create a table to store the return values.
CREATE OR REPLACE TABLE return_values_sp (str VARCHAR);

-- Create a stored procedure that sets the return value for the task.
CREATE OR REPLACE PROCEDURE set_return_value_sp()
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS $$
var stmt = snowflake.createStatement({sqlText:`CALL SYSTEM$SET_RETURN_VALUE('The quick brown fox jumps over the lazy dog');`});
  var res = stmt.execute();
$$;

-- Create a stored procedure that inserts the return value for the predecessor task into the 'return_values_sp' table.
CREATE OR REPLACE PROCEDURE get_return_value_sp()
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS $$
var stmt = snowflake.createStatement({sqlText:`INSERT INTO return_values_sp VALUES(SYSTEM$GET_PREDECESSOR_RETURN_VALUE());`});
var res = stmt.execute();
$$;

-- Create a task that calls the set_return_value_sp stored procedure.
CREATE TASK set_return_value_t
WAREHOUSE=warehouse1
SCHEDULE='1 MINUTE'
AS
  CALL set_return_value_sp();

-- Create a task that calls the get_return_value stored procedure.
CREATE TASK get_return_value_t
WAREHOUSE=warehouse1
AFTER set_return_value_t
AS
  CALL get_return_value_sp();

-- Resume task.
-- Wait for task to run on schedule.

SELECT DISTINCT(str) FROM return_values_sp;
+-----------------------------------------------+
|                      STR                      |
+-----------------------------------------------+
|  The quick brown fox jumps over the lazy dog  |
+-----------------------------------------------+

SELECT DISTINCT(RETURN_VALUE)
  FROM TABLE(information_schema.task_history())
  WHERE RETURN_VALUE IS NOT NULL;

+-----------------------------------------------+
|                  RETURN_VALUE                 |
+-----------------------------------------------+
|  The quick brown fox jumps over the lazy dog  |
+-----------------------------------------------+

Example 3: 변수를 사용해 반환 값 설정하기

다음 예제는 태스크 실행에 기반해 반환 값을 동적으로 생성하고 변수를 사용해 반환 값을 설정하는 방법을 보여줘요. 이 예제에서 태스크는 스트림(stream)에서 데이터를 랜딩 테이블로 로드하고 로드된 행 수를 나타내도록 반환 값을 설정해요:

CREATE OR REPLACE TASK load_raw_data
WAREHOUSE = 'WH'
WHEN
    SYSTEM$STREAM_HAS_DATA('NEW_WEATHER_DATA')
AS
    DECLARE
        rows_loaded NUMBER;
        result_string VARCHAR;
    BEGIN
        INSERT INTO raw_weather_data ( -- our landing table
            row_id)
        SELECT
            row_id
        FROM
            new_weather_data  -- our source stream
        ;

        -- to see the number of rows loaded in the UI
        rows_loaded := (SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())));
        result_string := :rows_loaded || ' rows loaded into RAW_WEATHER_DATA';
        -- show result string as task return value
        CALL SYSTEM$SET_RETURN_VALUE(:result_string);
    END;

더 알아보기 (Learn more)