Criação de um procedimento armazenado

Você cria um procedimento armazenado com um comando CREATE PROCEDURE que especifica as propriedades do procedimento, incluindo o manipulador a ser usado para sua lógica.

Este tópico lista as etapas para criar um procedimento. Para obter exemplos, consulte a referência CREATE PROCEDURE.

Nota

Você também pode criar e chamar um procedimento que não está armazenado para uso posterior. Muitas das propriedades para esse tipo de procedimento são as mesmas que para um procedimento armazenado. Para obter mais informações, consulte CALL (com procedimento anônimo).

Criação de um procedimento armazenado

Você cria um procedimento armazenado com as seguintes etapas:

  1. Escreva o código do manipulador que executa quando o procedimento é chamado.

    Você pode usar uma das linguagens do manipulador suportadas. Para obter mais informações, consulte Linguagens suportadas.

  2. Escolha se você vai manter o código do manipulador em linha com a instrução SQL CREATE PROCEDURE ou se vai se referir a ele em um estágio.

    Cada um tem suas vantagens. Para obter mais informações, consulte Como manter o código do manipulador inline ou em um estágio.

  3. Execute uma instrução CREATE PROCEDURE em SQL, especificando as propriedades do procedimento.

    O código no exemplo a seguir cria um procedimento chamado myProc com um manipulador inline MyClass.myMethod. A linguagem do manipulador é Java, que (como os manipuladores de procedimentos escritos em Scala e Python) requer um objeto Session da biblioteca do Snowpark. Aqui, a cláusula PACKAGES se refere à biblioteca do Snowpark incluída no Snowflake.

    CREATE OR REPLACE PROCEDURE myProc(fromTable STRING, toTable STRING, count INT)
      RETURNS STRING
      LANGUAGE JAVA
      RUNTIME_VERSION = '11'
      PACKAGES = ('com.snowflake:snowpark:latest')
      HANDLER = 'MyClass.myMethod'
      AS
      $$
        import com.snowflake.snowpark_java.*;
    
        public class MyClass
        {
          public String myMethod(Session session, String fromTable, String toTable, int count)
          {
            session.table(fromTable).limit(count).write().saveAsTable(toTable);
            return "Success";
          }
        }
      $$;
    
    Copy

    A seguir descrevemos algumas das propriedades necessárias ou tipicamente utilizadas na criação de um procedimento.

    • Nome do procedimento.

      O nome não precisa corresponder ao nome do manipulador. A instrução CREATE PROCEDURE associa o nome do procedimento ao manipulador.

      Para saber mais sobre restrições de nome e convenções, consulte Como nomear e sobrecarregar procedimentos e UDFs.

    • Argumentos de procedimento, se houver.

      Consulte Definição de argumentos para UDFs e procedimentos armazenados.

    • Tipo de retorno com a cláusula RETURNS.

      Para obter mais informações sobre como o Snowflake mapeia tipos de dados SQL para os tipos de dados do manipulador, consulte Mapeamentos de tipos de dados SQL-Java.

    • Nome do manipulador com a cláusula HANDLER.

      Quando necessário, este é o nome da classe ou método que contém o código que executa quando o procedimento é chamado. Você precisa especificar um nome de manipulador somente para manipuladores escritos em Java, Python e Scala. Para manipuladores de JavaScript e Script Snowflake, todos os códigos inline especificados serão executados como manipuladores.

      A tabela a seguir descreve a forma do valor da cláusula HANDLER com base na linguagem do manipulador.

      Linguagem do manipulador

      Formulário de valor

      Java

      Nome do método e classe

      Por exemplo: MyClass.myMethod

      JavaScript

      Nenhum.

      Python

      Nome do método e classe se for usada uma classe; caso contrário, nome da função.

      Por exemplo: module.my_function ou my_function

      Scala

      Nome do objeto e do método.

      Por exemplo: MyObject.myMethod

      Script Snowflake

      Nenhum.

    • Dependências exigidas pelo manipulador, se houver, usando as cláusulas IMPORTS ou PACKAGES.

      Para um manipulador escrito em Java, Python ou Scala, não se esqueça de especificar a biblioteca do Snowpark, como descrito na referência CREATE PROCEDURE.

      Para saber mais sobre como disponibilizar dependências para seu manipulador, consulte Disponibilização das dependências para seus códigos.

    • Linguagem do manipulador com a cláusula RUNTIME_VERSION.

      Quando a linguagem do manipulador for Java, Python ou Scala, use a cláusula RUNTIME_VERSION para especificar qual versão suportada no tempo de execução deve ser usada. Omitir a cláusula levará o Snowflake a usar o padrão, que pode mudar no futuro.

Exemplos

Manipulador inline

O código no exemplo a seguir cria um procedimento chamado my_proc com uma função de manipulador Python inline run. Através da cláusula PACKAGES, o código faz referência à biblioteca Snowpark incluída para Python, cujo Session é necessário quando Python é a linguagem do manipulador de procedimentos.

CREATE OR REPLACE PROCEDURE my_proc(from_table STRING, to_table STRING, count INT)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.8'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'run'
  AS
    $$
      def run(session, from_table, to_table, count):
        session.table(from_table).limit(count).write.save_as_table(to_table)
        return "SUCCESS"
    $$;
Copy

Manipulador em estágio

O código no exemplo a seguir cria um procedimento chamado my_proc com um método do manipulador de Java em estágio MyClass.myMethod. Através da cláusula PACKAGES, o código faz referência à biblioteca Snowpark incluída para Java, cujo Session é necessário quando Java é a linguagem do manipulador de procedimentos. Com a cláusula IMPORTS, o código faz referência ao arquivo preparado JAR contendo o código do manipulador.

CREATE OR REPLACE PROCEDURE my_proc(fromTable STRING, toTable STRING, count INT)
  RETURNS STRING
  LANGUAGE JAVA
  RUNTIME_VERSION = '11'
  PACKAGES = ('com.snowflake:snowpark:latest')
  IMPORRTS = ('@mystage/myjar.jar')
  HANDLER = 'MyClass.myMethod';
Copy