Есть ли простой способ получить скалярный результат из хранимой процедуры Snowflake? - PullRequest
0 голосов
/ 23 марта 2020

Есть ли простой способ получить скалярный результат из хранимой процедуры Snowflake в другой хранимой процедуре?

Я хотел бы использовать одну хранимую процедуру для генерации сложного оператора SQL и запуска этого SQL оператор в другой процедуре.

CREATE OR REPLACE PROCEDURE GENERATE_SQL( )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS 
$$
return "SELECT 'Hello world'";
$$
;

Наличие генерации SQL в отдельной процедуре позволило бы мне легче поддерживать / тестировать этот бит.

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Не напрямую.

Вы можете вызвать хранимую процедуру внутри другой хранимой процедуры; JavaScript во внешней хранимой процедуре может извлекать и сохранять выходные данные внутренней хранимой процедуры. Помните, однако, что внешняя хранимая процедура (и каждая внутренняя хранимая процедура) по-прежнему не может вернуть более одного значения вызывающей стороне.

Вы можете вызвать хранимую процедуру, а затем вызвать функцию RESULT_SCAN и передать ее. ID оператора, сгенерированный для хранимой процедуры.

Вы можете сохранить результирующий набор во временной таблице или постоянной таблице и использовать эту таблицу после возврата из вызова хранимой процедуры.

Если том Если данные не слишком велики, вы можете хранить несколько строк и нескольких столбцов в VARIANT (например, как значение JSON) и возвращать этот VARIANT.

1 голос
/ 23 марта 2020

Я хотел бы добавить к ответу MMV. Вы можете прочитать результаты первого SP без вызова RESULT_SCAN. Когда вы вызываете хранимую процедуру, вы получаете результирующий набор из одной строки, который содержит один столбец с тем же именем, что и хранимая процедура, которую вы вызвали. Таким образом, вы можете просто вызвать SP как запрос и получить значение в этом столбце следующим образом:

create or replace procedure second_sp()
returns string
language javascript
as
$$

    return "Hello world."

$$;

create or replace procedure first_sp()
returns string
language javascript
as
$$

  // Use the name of the SP called as the column name for the return:
  return ExecuteSingleValueQuery("SECOND_SP", "call second_sp()");

//  Helper function to read a single-value query

    function ExecuteSingleValueQuery(columnName, queryString) {
        var out;
        cmd1 = {sqlText: queryString};
        stmt = snowflake.createStatement(cmd1);
        var rs;
        try{
            rs = stmt.execute();
            rs.next();
            return rs.getColumnValue(columnName);
        }
        catch(err) {
            if (err.message.substring(0, 18) == "ResultSet is empty"){
                throw "ERROR: No rows returned in query.";
            } else {
                throw "ERROR: " + err.message.replace(/\n/g, " ");
            } 
        }
        return out;
    }
$$;

call second_sp();
call first_sp();
...