Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector

This topic explains how to run the Snowflake Scripting examples in Snowflake CLI, SnowSQL, and the Python Connector.

Nota

If you are using other clients and interfaces, such as Snowflake CLI or the JDBC driver, you can skip this topic and refer to Snowflake Scripting blocks.

Introdução

Atualmente, as seguintes interfaces não analisam corretamente os blocos de script do Snowflake:

  • Snowflake CLI

  • SnowSQL

  • Os métodos execute_stream() e execute_string() no código do conector Python.

    Nota

    Os outros métodos do conector Python analisam corretamente os blocos de script do Snowflake.

Entrar e executar um bloco do Script Snowflake pode resultar no seguinte erro:

SQL compilation error: syntax error line 2 at position 25 unexpected '<EOF>'
Copy

Para contornar esse problema, use delimitadores no início e no fim de um bloco do Script Snowflake se estiver usando essas interfaces.

As seções a seguir explicam como fazer isso:

Como usar delimitadores de constante de cadeia de caracteres em torno de um bloco em um procedimento armazenado

Se você estiver criando um procedimento armazenado, coloque o bloco do Script Snowflake entre aspas simples ou cifrões duplos. Por exemplo:

CREATE OR REPLACE PROCEDURE myprocedure()
  RETURNS VARCHAR
  LANGUAGE SQL
  AS
  $$
    -- Snowflake Scripting code
    DECLARE
      radius_of_circle FLOAT;
      area_of_circle FLOAT;
    BEGIN
      radius_of_circle := 3;
      area_of_circle := pi() * radius_of_circle * radius_of_circle;
      RETURN area_of_circle;
    END;
  $$
  ;
Copy

Nota

Ao especificar o bloco de script diretamente na linha de comando Snowflake CLI, os delimitadores $$ podem não funcionar em alguns shells porque eles interpretam esse delimitador como outra coisa. Por exemplo, os shells bash e zsh o interpretam como o ID do processo (PID). Para resolver essa limitação, você pode usar as seguintes alternativas:

  • Se ainda quiser especificar o bloco de script na linha de comando, você pode fazer o escape dos delimitadores $$, como em \$\$.

  • Você também pode colocar o bloco de script com os delimitadores padrão $$ em um arquivo separado e chamá-lo com o comando snow sql -f <filename>.

Passagem de um bloco como uma cadeia de caracteres literal para EXECUTE IMMEDIATE

Se você estiver escrevendo um bloco anônimo, passe o bloco como uma cadeia de caracteres literal para o comando EXECUTE IMMEDIATE. Para delimitar a cadeia de caracteres literal, use aspas simples ou cifrões duplos.

Por exemplo:

EXECUTE IMMEDIATE $$
-- Snowflake Scripting code
DECLARE
  radius_of_circle FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius_of_circle := 3;
  area_of_circle := pi() * radius_of_circle * radius_of_circle;
  RETURN area_of_circle;
END;
$$
;
Copy

Como alternativa, você pode definir uma variável de sessão que seja uma cadeia de caracteres literal contendo o bloco, e você pode passar essa variável de sessão para o comando EXECUTE IMMEDIATE. Por exemplo:

SET stmt =
$$
DECLARE
    radius_of_circle FLOAT;
    area_of_circle FLOAT;
BEGIN
    radius_of_circle := 3;
    area_of_circle := pi() * radius_of_circle * radius_of_circle;
    RETURN area_of_circle;
END;
$$
;

EXECUTE IMMEDIATE $stmt;
Copy

Nota

Ao especificar o bloco de script diretamente na linha de comando Snowflake CLI, os delimitadores $$ podem não funcionar em alguns shells porque eles interpretam esse delimitador como outra coisa. Por exemplo, os shells bash e zsh o interpretam como o ID do processo (PID). Para resolver essa limitação, você pode usar as seguintes alternativas:

  • Se ainda quiser especificar o bloco de script na linha de comando, você pode fazer o escape dos delimitadores $$, como em \$\$.

  • Você também pode colocar o bloco de script com os delimitadores padrão $$ em um arquivo separado e chamá-lo com o comando snow sql -f <filename>.