Alura > Cursos de Data Science > Cursos de SQL e Banco de Dados > Conteúdos de SQL e Banco de Dados > Primeiras aulas do curso PostgreSQL: desenvolva com PL/pgSQL

PostgreSQL: desenvolva com PL/pgSQL

Criando funções - Introdução

Boas-vindas à Alura! Meu nome é Vinicius Dias e guiarei vocês neste curso de PostgreSQL, em que vamos aprender a programar utilizando o Postgres. Antes de começar a aprender, antes de criar funções, você pode estar se perguntando: "Se já conheço linguagens de programação e já tenho funcionalidades criadas com a minha linguagem de programação favorita, por que eu criaria funções no banco de dados?".

Imagine uma funcionalidade no seu sistema que precisa executar três ou quatro queries para funcionar. Suponha que, para cada uma dessas queries, você acessa a rede para se conectar ao banco de dados, vai até o banco de dados e manda a instrução, capta o retorno, manda para o banco de dados de novo outra instrução, capta o retorno e fica dando voltas, repetindo essa ação.

Esse processo pode penalizar bastante a performance. Quando você tem essa sequência de instruções que precisam ser executadas no banco, criar uma função com todas essas instruções pode trazer ganho de performance, além até de facilitar a geração de relatórios. Pode ajudar em vários sentidos.

O que vamos aprender?

Neste curso, começaremos aprendendo como criar uma função utilizando SQL de forma bem simples. Vamos evoluindo até entender os detalhes de uma função, como retornar tipos bases e compostos, trabalharemos com parâmetros e exploraremos como trabalhar com parâmetros tanto de entrada quanto de saída. Nesses parâmetros de saída, vamos entender como retornar um único valor ou várias linhas.

Depois, estudaremos sobre programação em si, utilizando a famosa PL/pgSQL, a linguagem procedural do Postgres. Descobriremos as diferenças entre SQL e a PL/pgSQL e criar funcionalidades interessantes. Finalizaremos o curso com um exemplo em que, dentro de uma função (utilizando PL/pgSQL), vamos chamar outra função e entregar um resultado bem interessante, utilizando lógica de programação, estruturas de decisão e de repetição.

Trata-se de um curso com bastante conteúdo. Caso você fique com alguma dúvida no processo, não hesite, você pode abrir uma dúvida no fórum. Nossa comunidade de alunos, moderadores e instrutores é bem solícita, alguém conseguirá te ajudar. Espero que você goste este treinamento. Estou te esperando no próximo vídeo para começarmos a bater um papo sobre esse mundo que é a programação no banco de dados.

Criando funções - SQL e programação

Neste vídeo, vamos conversar sobre o que estudaremos no curso e os motivos para estudar esses assuntos. Nos cursos anteriores, trabalhamos com diversos conceitos do Postgres. Estudamos sobre a estrutura de organização do projeto, sobre servidor, banco de dados, schemas, tabelas, sequências, tipos e views.

Contudo, existem funcionalidades que a linguagem SQL não provém para nós. Se for preciso aplicar funcionalidades no banco de dados que dependem de alguma lógica de programação, não conseguiremos realizá-las utilizando puramente SQL.

Por exemplo, ao cadastrar um aluno, quereremos verificar se ele tem mais de 18 anos. Se sim, adicionaremos um campo informando que ele pode acessar determinados cursos. Caso contrário, vou buscar em outra tabela uma informação diferente para adicionar. Caso tenhamos esses cenários mais complexos, com lógica de programação, ainda não sabemos como proceder utilizando SQL.

Nesse sentido, o que os bancos de dados implementam, o que eles fazem? Eles fornecem uma extensão ao SQL. A linguagem SQL nos fornece os comandos de DML e DDL para manipular e modelar dados, como estudamos no último curso. Mas o SQL não fornece formas de realizar lógica de programação, de realmente programar no banco de dados. Em vez disso, temos uma extensão da linguagem SQL para realizar esse trabalho.

O nome dessa parte com a qual trabalharemos é funções. Vamos criar funções e entender a estrutura delas, como defini-las e chamá-las, o que podemos colocar dentro de funções. Conforme avançamos, estudaremos entender o propósito de determinadas funcionalidades.

Em resumo, vamos aprender a programar utilizando banco de dados. Então, é bastante interessante que você já tenha pelo menos uma noção de lógica de programação, que você saiba o que é uma estrutura de controle, de repetição. Nós vamos aprender sobre esses tópicos no curso, mas, caso você já tenha esse conhecimento, conseguirá aproveitar de forma bem mais tranquila.

Agora que entendemos que aprenderemos sobre uma extensão da linguagem SQL, vamos começar a estudar e finalmente criar nossa primeira função.

Criando funções - Primeira função

Vamos criar nossa primeira função utilizando o PostgreSQL. Primeiramente, vamos abrir a documentação do PostgreSQL na seção de server programming, isto é, programação do lado do servidor. De início, temos um sumário com vários tópicos — estudaremos muitos deles.

Um dos capítulos chama-se "Query Language (SQL) functions", funções utilizando SQL. Como já conhecemos SQL, vamos acessá-la. No primeiro bloco de código de exemplo, encontramos uma sintaxe um tanto quanto diferente. Vamos copiá-la.

No menu lateral do pgAdmin, clicaremos com o botão direito sobre o banco de dados "alura" e selecionaremos "Query Tool...". Vamos colar o código e analisá-lo:

CREATE FUNCTION clean_emp() RETURNS void AS '
    DELETE FROM emp
        WHERE salary < 0;
' LANGUAGE SQL;

Para criar uma função, primeiramente informamos que estamos criando uma função com CREATE FUNCTION. Em seguida, damos um nome a ela. Vamos substituir o nome clean_emp() por primeira_funcao(), para ficar com um nome bem sugestivo:

CREATE FUNCTION primeira_funcao() RETURNS void AS '
    DELETE FROM emp
        WHERE salary < 0;
' LANGUAGE SQL;

Se você já tem familiaridade com programação e costuma seguir um padrão diferente para nomear funções, não tem problema. De costume, utiliza-se o snake case, separando palavras com um underline, mas você pode combinar o formato com a sua equipe.

Portanto, a sintaxe é CREATE FUNCTION para criar uma função, seguido do nome dessa função. Mais adiante, estudaremos os parênteses que aparecem após o nome. A seguir, informamos o que será retornado. "Void" é uma palavra especial que significa "nada", que nada será retornado. No nosso caso, queremos que ela devolva um número inteiro, então digitaremos "INTEGER":

CREATE FUNCTION primeira_funcao() RETURNS INTEGER AS '
    DELETE FROM emp
        WHERE salary < 0;
' LANGUAGE SQL;

O termo "AS" significa "como". Entre aspas (ou outro caractere que podemos definir), colocaremos o corpo da função, o que acontecerá nessa função. Depois da definição, informamos a linguagem em que ela será executada. Por ora, SQL.

Vamos alterar o corpo da função para que ela retorne um inteiro, utilizando o comando SELECT e uma conta matemática, por exemplo:

CREATE FUNCTION primeira_funcao() RETURNS INTEGER AS '
    SELECT (5 - 3) * 2
' LANGUAGE SQL;

Para executar, podemos pressionar a tecla "F5" ou clicar no ícone de play no menu superior. Na parte inferior, teremos a mensagem de que a função foi criada com sucesso.

Existem várias maneiras de chamar uma função. Vamos tentar usar o seguinte comando:

SELECT * primeira_funcao();

Com o asterisco, estamos buscando tudo que a função retorna como se fosse uma tabela e chamando o nome da função. Porém, ao executar, temos um erro de sintaxe, então vamos tentar de outra maneira, sem o asterisco:

SELECT primeira_funcao();

Queremos buscar todos os itens, porém a função devolve um item só:

#primeira_funcao
14

Mais adiante, entenderemos por que isso aconteceu. Por enquanto, descobrimos que, com o comando SELECT primeira_funcao(), buscamos a informação devolvida pela função.

Repare que o nome da coluna resultante é "primeira_funcao". Se fôssemos colocar em um relatório, seria melhor renomeá-la para algo mais simples, como "numero". Podemos renomeá-la como aprendemos anteriormente:

SELECT primeira_funcao() AS numero;

Quando temos uma função que retorna um valor, podemos tratar a chamada dessa função como um valor normal, como uma coluna de uma tabela. Por isso, conseguimos renomeá-la sem problemas.

Recapitulando: a estrutura para criarmos uma função em SQL é CREATE FUNCTION, o nome da função, o tipo de valor retornado, o expressão AS, o corpo da função entre aspas simples e a linguagem (no caso, SQL). Vale lembrar que o corpo é o que será executado quando chamarmos a função.

Para chamar a função, utilizamos o comando SELECT. Ele buscará o valor dessa função, que é o que ela retorna. Mais adiante, estudaremos mais sobre retornos também. Como o retorno se torna um valor, podemos definir ALIAS e até fazer JOIN com tabelas.

Sobre o curso PostgreSQL: desenvolva com PL/pgSQL

O curso PostgreSQL: desenvolva com PL/pgSQL possui 144 minutos de vídeos, em um total de 67 atividades. Gostou? Conheça nossos outros cursos de SQL e Banco de Dados em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda SQL e Banco de Dados acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas