Можно ли установить переменную внутри хранимой процедуры, чтобы представление использовало ее? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть представление, которое зависит от переменной сеанса:

create or replace view test as 
(
    select getvariable('MY_VAR')::int as col1
) ;

Я могу запросить это представление следующим образом:

set MY_VAR=5;
select * from test; -- 5
set MY_VAR=6;
select * from test; -- 6

Теперь я хочу сделать тот же запрос изхранимая процедура:

create or replace procedure myproc()
    returns VARCHAR
    language javascript
    as 
$$
    var stmt = snowflake.createStatement({sqlText: "select * from test"});
    var rs = stmt.execute();
    rs.next(); // .next().getColumnValue(1);

    return rs.getColumnValue(1);
$$
;

call myproc() -- this work as long as MY_VAR is set outside before the call proc

Дело в том, что я хочу установить переменную сеанса изнутри процедуры, а это недопустимо

Ошибка выполнения хранимой процедуры: неподдерживаемый тип оператора'УСТАНОВЛЕН'. В Snowflake.execute

В конечном счете, цель состоит в том, чтобы иметь задание Snowflake, которое выполняет хранимую процедуру, и мне нужно как-то установить переменную (TASK также не позволяет запускать set,и ни один не делает хранимую процедуру).

Есть ли обходной путь?

1 Ответ

3 голосов
/ 15 октября 2019

Причина, по которой вы не можете установить переменную сеанса внутри хранимой процедуры, заключается в том, что по умолчанию режим выполнения установлен на EXECUTE AS OWNER , что является более ограничительным режимом из-за проблем безопасности.

Пожалуйста, смотрите эту страницу документации Snowflake для получения дополнительной информации.

Таким образом, вы можете устанавливать (и использовать) переменную сеанса внутри вашей хранимой процедуры, только если выустановите режим выполнения хранимой процедуры на EXECUTE AS CALLER . Вот пересмотренная версия вашей хранимой процедуры, которая демонстрирует использование переменных сеанса (используя произвольное значение 7):

CREATE OR REPLACE PROCEDURE MYPROC()
  RETURNS VARCHAR
  LANGUAGE JAVASCRIPT
  EXECUTE AS CALLER
AS $$
    snowflake.execute({"sqlText": "SET MY_VAR = 7"});
    var stmt = snowflake.createStatement({"sqlText": "select * from test"});
    var rs = stmt.execute();
    rs.next(); // .next().getColumnValue(1);

    return rs.getColumnValue(1);
$$
;
...