Procedimentos armazenados e UDTFs: nomes de argumento respeitados em chamadas

Atenção

Essa mudança de comportamento está no pacote 2023_03.

Para saber o status atual do pacote, consulte Histórico do pacote.

Em chamadas para procedimentos armazenados e funções de tabela definidas pelo usuário (UDTFs), onde a chamada inclui argumentos nomeados, o Snowflake dará precedência aos nomes dos argumentos sobre a posição do argumento, conforme a seguir.

Anteriormente

Ao chamar procedimentos ou funções de tabela definidas pelo usuário (UDTFs) que tenham argumentos nomeados, o Snowflake ignorará os nomes dos argumentos e usará a posição do argumento para determinar qual valor é passado para o procedimento ou função.

Atualmente

Os nomes dos argumentos terão precedência sobre a posição do argumento em chamadas para procedimentos e UDTFs. Isso pode resultar no seguinte comportamento diferente de antes da mudança de comportamento:

  • Uma chamada em funcionamento anterior para um procedimento armazenado ou função de tabela definida pelo usuário pode resultar em um erro.

  • Os nomes dos argumentos podem fazer com que os argumentos sejam passados em uma ordem diferente da anterior. Isso pode resultar em erro, resultados errados ou inserção de dados errados.

  • Os nomes dos argumentos podem fazer com que um procedimento armazenado diferente com o mesmo nome seja chamado. Isso pode resultar em erro, resultados errados ou inserção de dados errados.

  • O exemplo a seguir ilustra como as chamadas para dois procedimentos armazenados podem diferir antes e depois da alteração.

O exemplo a seguir ilustra como as chamadas para dois procedimentos armazenados podem diferir antes e depois da alteração.

-- One stored procedure
CREATE OR REPLACE PROCEDURE proc(STRARG1 varchar, STRARG2 varchar)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
  return 'hello';
END
$$;
-- Another procedure
CREATE OR REPLACE PROCEDURE proc(ARG1 number, ARG2 number)
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
BEGIN
  return ARG1 < ARG2;
END
$$;
-- Example A
-- Before: returns 'hello'
-- After: returns TRUE
CALL PROC(ARG1 => '5', ARG2 => '100');
-- Example B
-- Before: returns TRUE
-- After: returns 'hello'
CALL PROC(STRARG1 => 5, STRARG2 => 100); -- 'hello'.
Copy

Ref: 1017