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>' )
Copy

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  |
+-----------------------------------------------+
Copy

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  |
+-----------------------------------------------+
Copy

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