- Categorias:
Funções do sistema (Informações do sistema)
SYSTEM$SET_RETURN_VALUE¶
Define explicitamente o valor de retorno para uma tarefa.
Em um gráfico de tarefas, uma tarefa pode chamar esta função para definir um valor de retorno. Outra tarefa que identifica esta tarefa como a tarefa predecessora (usando a palavra-chave AFTER
na definição da tarefa) pode recuperar o valor de retorno definido pela tarefa predecessora usando SYSTEM$GET_PREDECESSOR_RETURN_VALUE.
Sintaxe¶
SYSTEM$SET_RETURN_VALUE( '<string_expression>' )
O valor do argumento string_expression
pode ser um literal de cadeia de caracteres ou uma variável; por exemplo, SYSTEM$SET_RETURN_VALUE(:VARIABLE)
.
Argumentos¶
string_expression
A cadeia de caracteres a ser definida como o valor de retorno. O tamanho da cadeia de caracteres deve ser <= 10 kB (quando codificado em UTF8).
Exemplos¶
Crie uma tarefa que defina um valor de retorno. Crie uma segunda tarefa, secundária, que seja executada depois que a tarefa anterior tiver sido concluída. A tarefa secundária recupera o valor de retorno definido pela tarefa anterior (chamando SYSTEM$GET_PREDECESSOR_RETURN_VALUE) e o insere em uma linha de tabela:
-- Create a table to store the return values. CREATE OR REPLACE TABLE return_values (str VARCHAR); -- Create a task that sets the return value for the task. CREATE TASK set_return_value 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 WAREHOUSE=return_task_wh AFTER set_return_value AS INSERT INTO return_values 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 WAREHOUSE=return_task_wh AFTER set_return_value AS INSERT INTO return_values VALUES(SYSTEM$GET_PREDECESSOR_RETURN_VALUE('SET_RETURN_VALUE')); -- Resume task (using ALTER TASK ... RESUME). -- Wait for task to run on schedule. SELECT DISTINCT(str) FROM return_values; +-----------------------------------------------+ | 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 | +-----------------------------------------------+
Exemplo 2: chamada por meio de um procedimento armazenado separado¶
Similar ao primeiro exemplo, mas definindo o valor de retorno para a tarefa e recuperá-lo chamando procedimentos armazenados separadamente:
-- 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 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 |
+-----------------------------------------------+
Exemplo 3: usar uma variável para definir o valor de retorno¶
O exemplo a seguir demonstra como gerar dinamicamente um valor de retorno com base na execução da tarefa e definir o valor de retorno usando uma variável. Nesse exemplo, a tarefa carrega dados de um fluxo em uma tabela de destino e define o valor de retorno para indicar o número de linhas carregadas:
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;