CREATE LANGUAGE — define uma nova linguagem procedural
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnomeHANDLERtratador_de_chamadas[ INLINEtratador_em_linha] [ VALIDATORfunção_validadora] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnome
O comando CREATE LANGUAGE registra uma nova
linguagem procedural em um banco de dados do
PostgreSQL.
Em seguida, poderão ser definidas funções e procedimentos nesta nova
linguagem.
O comando CREATE LANGUAGE efetivamente associa
o nome da linguagem com as funções do tratador responsáveis pela
execução das funções escritas na linguagem.
Veja Escrita de tratador de linguagem procedural para obter mais informações sobre
tratadores de linguagem.
O comando CREATE OR REPLACE LANGUAGE irá criar
uma nova linguagem, ou substituir uma definição existente.
Se a linguagem já existir, seus parâmetros serão atualizados
segundo o comando, mas as configurações de posse e
permissões da linguagem não serão alteradas, e quaisquer funções
existentes escritas na linguagem serão consideradas válidas.
É necessário ter o privilégio de superusuário do PostgreSQL para registrar uma nova linguagem, ou alterar os parâmetros de uma linguagem existente. Entretanto, uma vez criada a linguagem, é válido atribuir a posse dela a um não-superusuário, que poderá removê-la, alterar suas permissões, mudar seu nome, ou atribuí-la a um novo dono. (Entretanto, não se deve atribuir a posse das funções C subjacentes a um não-superusuário; isto criaria um caminho para escalar os privilégios para este usuário.)
A forma do comando CREATE LANGUAGE que não
fornece nenhuma função tratadora está obsoleta.
Para manter a compatibilidade com os arquivos de cópia de segurança
antigos, este comando é interpretado como
CREATE EXTENSION.
Isto irá funcionar se a linguagem tiver sido empacotada em uma
extensão com o mesmo nome, que é a maneira convencional de
configurar linguagens procedurais.
TRUSTED
TRUSTED especifica que a linguagem não concede
acesso a dados que o usuário não teria acesso de outra forma.
Se esta palavra-chave for omitida ao registrar a linguagem,
somente os usuários com o privilégio de superusuário do
PostgreSQL poderão usar esta
linguagem para criar novas funções.
PROCEDURALEsta é uma palavra ruído.
nomeO nome da nova linguagem procedural. O nome deve ser único entre as linguagens no banco de dados.
HANDLER tratador_de_chamadas
O tratador_de_chamadas
é o nome de uma função previamente registrada, que será chamada
para executar as funções escritas na linguagem procedural.
O tratador de chamadas para uma linguagem procedural deve ser
escrito em uma linguagem compilada, como C
com convenção de chamada versão 1, e registrado no
PostgreSQL como uma função sem
argumentos, e retornando o tipo de dados
language_handler, um tipo de dados simbólico
(placeholder), usado
simplesmente para identificar a função como tratadora de
chamadas.
INLINE tratador_em_linha
O tratador_em_linha
é o nome de uma função previamente registrada, que será chamada
para executar um bloco de código anônimo
(o comando DO) escrito nesta linguagem.
Se não for especificada nenhuma função para
tratador_em_linha,
a linguagem não fornecerá suporte a blocos de código anônimos.
A função tratadora deve receber um argumento do tipo
internal, que será a representação interna do comando
DO, e normalmente retornará void.
O valor retornado pela função tratadora é ignorado.
VALIDATOR função_validadora
A função_validadora
é o nome de uma função previamente registrada, que será chamada
quando for criada uma nova função escrita na linguagem, para
validar a nova função.
Se não for especificada nenhuma função validadora, uma nova função
escrita nesta linguagem não será verificada quando for criada.
A função validadora deve receber um argumento do tipo de dados
oid, que será o OID da função
a ser criada, e normalmente retornará void.
A função validadora normalmente inspecionaria o corpo da função
quanto à correção sintática, mas também pode examinar outras
propriedades da função, por exemplo, se a linguagem não puder
lidar com certos tipos de dados de argumento.
Para sinalizar um erro, a função validadora deve usar a função
ereport().
O valor retornado pela função validadora é ignorado.
É usado o comando DROP LANGUAGE para remover linguagens procedurais.
O catálogo do sistema pg_language
registra informações sobre as linguagens atualmente instaladas.
Além disso, o meta-comando \dL do
psql lista as linguagens instaladas.
Para criar funções em uma linguagem procedural, o usuário deve ter
o privilégio USAGE para a linguagem.
Por padrão, é concedido USAGE para
PUBLIC (ou seja, todos) para as linguagens
confiáveis.
Isto pode ser revogado, se desejado.
Linguagens procedurais são locais para bancos de dados individuais.
No entanto, a linguagem pode ser instalada no banco de dados
template1, o que fará com que esteja disponível
automaticamente em todos os bancos de dados criados posteriormente.
Uma sequência mínima para criar uma nova linguagem procedural é:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
Normalmente, isto seria escrito no script de criação de uma extensão, e os usuários fariam o seguinte para instalar a extensão:
CREATE EXTENSION plsample;
O comando CREATE LANGUAGE é uma extensão do
PostgreSQL.