Sou novo no PostgreSQL, venho de SQL server e estou tendo problemas para criar uma função e/ou procedimento. Antes de mais nada, posso apenas esclarecer que a única diferença entre uma função e um procedimento é de fato o suporte para transações?
Agora voltando ao meu problema, eu quero um func/proc simples que retorne o usuário conectado atual. Não usando de qualquer maneira, então qualquer outro exemplo funcionaria, é apenas para aprender a sintaxe, pois pgsql é diferente de t-sql. Aqui está o meu código, que tirei de um site de tutoriais:
CREATE OR REPLACE FUNCTION dev.get_user()
RETURNS VARCHAR AS $user$
DECLARE
$user$ VARCHAR;
BEGIN
SELECT current_user AS user;
RETURN user;
END;
$user$ LANGUAGE plpgsql;
Estou recebendo isso e não sei porque:
ERROR: syntax error at or near "VARCHAR"
LINE 4: $user$ VARCHAR;
Se eu remover a linha 4, ela a cria com sucesso, mas quando eu a executo, ela retorna este erro:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
Estou no pgsql 12.3, se faz alguma diferença. Obrigada.
Não, a maior diferença é que as funções se destinam a retornar algo enquanto os procedimentos não.
Em PL/pgSQL, o resultado de uma instrução SELECT precisa ser armazenado em algum lugar (que é o que a mensagem de erro está dizendo).
As variáveis não são definidas com a
$
, então a segunda$user$
termina a string iniciada com a primeira$user$
e é por isso que você obtém o primeiro erro.Então, a maneira correta de escrever isso seria:
O SELECT não é realmente necessário, você pode atribuir uma variável diretamente se chamar uma função (que
current_user
é):A atribuição usando
:=
é mais rápida que umSELECT .. INTO
.Observe que toda a função pode ser simplificada para:
Para mais detalhes veja a referência PL/pgSQL