Можно ли установить переменную внутри хранимой процедуры, чтобы представление ее использовало?

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

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

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

Ошибка выполнения хранимой процедуры: неподдерживаемый тип оператора «SET». В Snowflake.execute

В конечном итоге цель состоит в том, чтобы иметь ЗАДАЧУ Снежинки, которая запускает хранимую процедуру, и мне нужно иметь возможность каким-то образом установить переменную (ЗАДАЧА также не позволяет запускать набор, как и хранимая процедура).

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


person RubenLaguna    schedule 15.10.2019    source источник


Ответы (1)


Причина, по которой вы не можете УСТАНОВИТЬ переменную сеанса внутри хранимой процедуры, заключается в том, что по умолчанию режим выполнения установлен на ВЫПОЛНИТЬ КАК ВЛАДЕЛЕЦ, что является более строгим режимом из соображений безопасности.

См. Этот на странице документации Snowflake для получения дополнительной информации.

Таким образом, вы можете УСТАНОВИТЬ (и использовать) переменную сеанса внутри своей хранимой процедуры, только если вы установите режим выполнения хранимой процедуры на ВЫПОЛНИТЬ КАК ВЫЗОВА. Вот исправленная версия вашей хранимой процедуры, которая демонстрирует использование переменных сеанса (с произвольным значением 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);
$$
;
person Darren Gardner    schedule 15.10.2019