CREATE PROCEDURE

CREATE PROCEDURE — define um novo procedimento

Sinopse

CREATE [ OR REPLACE ] PROCEDURE
    nome (
    [ [ modo_do_argumento ]
    [ nome_do_argumento ] tipo_de_dados_do_argumento
    [ { DEFAULT | = } expressão_padrão ]
    [, ...] ] )
  { LANGUAGE nome_da_linguagem
    | TRANSFORM { FOR TYPE nome_do_tipo_de_dados } [, ... ]
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | SET parâmetro_de_configuração { TO valor | = valor | FROM CURRENT }
    | AS 'definição'
    | AS 'arquivo_objeto', 'símbolo_de_ligação'
    | corpo_sql
  } ...

Descrição

O comando CREATE PROCEDURE define um novo procedimento [133]. O comando CREATE OR REPLACE PROCEDURE cria um novo procedimento, ou substitui uma definição existente. Para poder definir um procedimento, é necessário ter o privilégio USAGE na linguagem.

Se for incluído o nome do esquema, o procedimento será criado no esquema especificado. Caso contrário, será criado no esquema corrente. O nome do novo procedimento não deve corresponder a nenhum procedimento ou função existente com os mesmos tipos de dados dos argumentos de entrada no mesmo esquema. Entretanto, procedimentos e funções com diferentes tipos de dados dos argumentos podem compartilhar o mesmo nome (isto se chama sobrecarga).

Para substituir a definição corrente de um procedimento existente, é usado o comando CREATE OR REPLACE PROCEDURE. Não é possível alterar o nome ou os tipos de dados dos argumentos de um procedimento dessa forma (se fosse tentado, na verdade, estaria sendo criado um procedimento novo e distinto).

Quando é usado CREATE OR REPLACE PROCEDURE para substituir um procedimento existente, o dono e as permissões do procedimento não mudam. Todas as outras propriedades do procedimento recebem os valores especificados ou implícitos no comando. É necessário ser o dono do procedimento para substituí-lo (isto inclui ser membro da função de banco de dados (role) dona).

O usuário que cria o procedimento se torna o dono do procedimento.

Para poder criar um procedimento, é necessário possuir o privilégio USAGE nos tipos de dados dos argumentos.

Veja Procedimentos definidos pelo usuário para obter mais informações sobre como escrever procedimentos.

Parâmetros

nome

O nome (opcionalmente qualificado pelo esquema) do procedimento a ser criado.

modo_do_argumento

O modo do argumento: IN, OUT, INOUT, ou VARIADIC. Se omitido, o padrão é IN.

nome_do_argumento

O nome do argumento.

tipo_de_dados_do_argumento

Os tipos de dados dos argumentos do procedimento (opcionalmente qualificados pelo esquema), se houver. Os tipos de dados dos argumentos podem ser tipos base, compostos ou de domínio, ou podem fazer referência ao tipo de dados de uma coluna da tabela.

Dependendo da linguagem de implementação, também pode ser permitido especificar pseudo-tipos, como cstring. Pseudo-tipos indicam que o tipo de dados do argumento real está especificado de forma incompleta ou fora do conjunto de tipos de dados SQL comuns.

O tipo de dados de uma coluna é referenciado escrevendo nome_da_tabela.nome_da_coluna%TYPE. O uso desse recurso pode, às vezes, ajudar a tornar o procedimento independente das alterações na definição da tabela.

expressão_padrão

Expressão a ser usada como valor padrão se o parâmetro não for especificado. A expressão deve ser conversível para o tipo de dados do argumento do parâmetro. Todos os parâmetros de entrada que seguem um parâmetro com valor padrão também devem ter valor padrão.

nome_da_linguagem

O nome da linguagem na qual o procedimento é implementado. Pode ser sql, c, internal, ou o nome de uma linguagem procedural definida pelo usuário, por exemplo, plpgsql. O padrão é sql se for especificado o corpo_sql. Colocar o nome entre apóstrofos é obsoleto, e requer letras maiúsculas e minúsculas correspondentes.

TRANSFORM { FOR TYPE nome_do_tipo_de_dados } [, ... ] }

Lista as transformações aplicadas a uma chamada ao procedimento. As transformações convertem entre tipos de dados SQL e tipos de dados específicos da linguagem; veja CREATE TRANSFORM. As implementações das linguagens procedurais geralmente têm conhecimento codificado dos tipos de dados integrados, portanto, estes não precisam ser listados aqui. Se uma implementação de linguagem procedural não souber como lidar com um determinado tipo de dados, e não for fornecida nenhuma transformação, a linguagem adotará o comportamento padrão para converter tipos de dados, mas isto depende da implementação.

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER

A cláusula SECURITY INVOKER indica que o procedimento deve ser executado com os privilégios do usuário que o chama. Este é o comportamento padrão. A cláusula SECURITY DEFINER especifica que o procedimento deve ser executado com os privilégios do usuário que é o seu dono.

A palavra-chave EXTERNAL é permitida para manter a conformidade com o padrão SQL, mas é opcional, porque, ao contrário do padrão SQL, este recurso se aplica a todas os procedimentos, e não apenas aos externos.

Um procedimento SECURITY DEFINER não pode executar instruções de controle de transação (por exemplo, COMMIT e ROLLBACK, dependendo da linguagem).

parâmetro_de_configuração
valor

A cláusula SET faz com que o parâmetro de configuração especificado seja definido como o valor especificado quando o procedimento é chamado e, em seguida, restaurado para seu valor anterior quando o procedimento é encerrado. A cláusula SET FROM CURRENT salva o valor corrente do parâmetro quando CREATE PROCEDURE é executado como o valor a ser aplicado quando o procedimento é chamado.

Se for anexada a cláusula SET a um procedimento, então os efeitos do comando SET LOCAL executado dentro do procedimento para a mesma variável ficam restritos ao procedimento: o valor anterior do parâmetro de configuração ainda é restaurado na saída do procedimento. No entanto, um comando SET comum (sem LOCAL) substitui a cláusula SET, tanto quanto faria para um comando SET LOCAL anterior: os efeitos desse comando persistirão após a saída do procedimento, a menos que a transação corrente seja desfeita.

Se for anexada uma cláusula SET a um procedimento, este procedimento não poderá executar instruções de controle de transação (por exemplo, COMMIT e ROLLBACK, dependendo da linguagem).

Veja SET e Configuração do servidor para obter mais informações sobre nomes e valores de parâmetros permitidos.

definição

Uma constante cadeia de caracteres que define o procedimento; o significado depende da linguagem. Pode ser um nome de procedimento interno, o caminho para um arquivo objeto, um comando SQL, ou texto em uma linguagem procedural.

Muitas vezes é útil usar a delimitação por cifrão (veja Constantes do tipo cadeia de caracteres delimitadas por cifrão) para escrever a cadeia de caracteres de definição do procedimento, em vez da sintaxe normal de apóstrofos. Sem delimitação por cifrão, quaisquer apóstrofos ou contrabarras na definição do procedimento devem ser duplicados.

arquivo_objeto, símbolo_de_ligação

Esta forma da cláusula AS é usada para procedimentos na linguagem C carregáveis dinamicamente, quando o nome do procedimento no código-fonte da linguagem C não é o mesmo que o nome do procedimento SQL. A cadeia de caracteres arquivo_objeto é o nome do arquivo de biblioteca compartilhada que contém o procedimento C compilado, sendo interpretado como para o comando LOAD. A cadeia de caracteres símbolo_de_ligação é o símbolo de ligação do procedimento, ou seja, o nome do procedimento no código-fonte da linguagem C. Se o símbolo de ligação for omitido, é assumido como sendo igual ao nome do procedimento SQL que está sendo definido.

Quando o comando CREATE PROCEDURE é chamado repetidas vezes para o mesmo arquivo objeto, o arquivo objeto é carregado apenas uma vez por sessão. Para descarregar e recarregar o arquivo (talvez durante o desenvolvimento), deve ser iniciada uma nova sessão.

corpo_sql

O corpo de um procedimento escrito em LANGUAGE SQL. Deve ser um bloco

BEGIN ATOMIC
  instrução;
  instrução;
  ...
  instrução;
END

Esta forma é semelhante a escrever o texto do corpo do procedimento como uma constante cadeia de caracteres (veja definição acima), mas existem algumas diferenças: esta forma funciona apenas para LANGUAGE SQL, enquanto a forma constante cadeia de caracteres funciona para todas as linguagens. Esta forma é analisada no tempo de definição do procedimento, a forma constante cadeia de caracteres é analisada no tempo de execução; portanto, esta forma não pode dar suporte a argumentos com tipos de dados polimórficos, e outras construções que não podem ser resolvidas no momento de definição do procedimento. Esta forma rastreia as dependências entre o procedimento e os objetos usados no corpo do procedimento, portanto, DROP ... CASCADE funcionará corretamente, enquanto a forma que usa literais cadeia de caracteres pode deixar funções pendentes. Finalmente, esta forma é mais compatível com o padrão SQL e outras implementações da linguagem SQL.

Notas

Veja CREATE FUNCTION para obter mais detalhes sobre a criação de funções que também se aplicam a procedimentos.

Deve ser usado o comando CALL para executar um procedimento.

Exemplos

CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;

ou

CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
BEGIN ATOMIC
  INSERT INTO tbl VALUES (a);
  INSERT INTO tbl VALUES (b);
END;

e chame assim:

CALL insert_data(1, 2);

Exemplo 81. Exemplo do tradutor

Procedimentos retornando o valor da secante

Este exemplo mostra dois procedimentos que retornam o valor da secante de um ângulo, que é a razão entre a hipotenusa e o cateto adjacente a este ângulo, ou seja, 1/cos(x). O primeiro procedimento foi escrito para o gerenciador de banco de dados DB2 da IBM na linguagem SQL, e o segundo procedimento foi escrito na linguagem PL/pgSQL para o PostgreSQL para fins de comparação.

-- DB2

CREATE OR REPLACE PROCEDURE secante ( IN x DOUBLE PRECISION, OUT sec DOUBLE PRECISION )
    LANGUAGE SQL
BEGIN
    SET sec = 1.0 / cos(x);
END;

CALL secante(3.141592654, ?);
|SEC|
|---|
|-1 |
-- PostgreSQL

CREATE OR REPLACE PROCEDURE secante ( IN x DOUBLE PRECISION, OUT sec DOUBLE PRECISION )
AS $$
BEGIN
    sec :=  1.0 / cos(x);
END;
$$ LANGUAGE plpgsql;

CALL secante(3.141592654, null);
 sec
-----
  -1
(1 linha)


Conformidade

O comando CREATE PROCEDURE é definido no padrão SQL. A implementação do PostgreSQL pode ser usada de forma compatível, mas possui várias extensões. Para obter detalhes veja também CREATE FUNCTION.

Veja também

ALTER PROCEDURE, DROP PROCEDURE, CALL, CREATE FUNCTION


[133] A instrução CREATE PROCEDURE (SQL) define um procedimento SQL no servidor corrente. IBM DB2 12.1.x (N. T.)