CREATE PROCEDURE — define um novo procedimento
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
} ...
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.
nomeO 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_argumentoO nome do argumento.
tipo_de_dados_do_argumentoOs 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
.
O uso desse recurso pode, às vezes, ajudar a tornar o procedimento
independente das alterações na definição da tabela.
nome_da_tabela.nome_da_coluna%TYPE
expressão_padrãoExpressã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çãovalor
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çãoUma 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 ATOMICinstruçã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.
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.
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)
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.
[133]
A instrução CREATE PROCEDURE (SQL) define um
procedimento SQL no servidor corrente.
IBM DB2 12.1.x (N. T.)