Prof. Jônatas Costa de Oliveira Sumário Visão Geral Estrutura do Bloco PL/PGSQL Declarações Comandos Estruturas de Controle Estruturas de Repetição Cursores Visão Geral Pode ser usado para criar funções e triggers. Adiciona estruturas de controle na linguagem SQL; Pode executar computações complexas; Pode ser definido para ser confiável pelo servidor; Fácil de usar; Visão Geral Cada bloco SQL deve ser enviado individualmente para o servidor; Então há uma comunicação intensa, que pode ser diminuída com o PL/pgSQL. Vantagens: Comunicações extras são eliminadas; Resultados intermediários que não são necessários ao cliente não devem ser “marshaled” ou transferidos entre servidor e cliente; Múltiplas rodadas de leitura de consultas pode ser evitado. Estrutura PLPG/SQL [ <<label>> ] [ DECLARE declarations ] BEGIN statements END [ label ]; Exercício 1) Criar uma função pl/pgsql que através de dois parâmetros passados de entrada, calcula a média entre eles. Utilize uma variável auxiliar para receber a média. E não utilize parâmetros OUT. Ex2) Para o modelo abaixo, crie uma função SQL que calcule o desconto de 10% de um valor. Depois crie uma consulta que calcule que apresenta a mensalidade atual, e quanto seria a mensalidade dos alunos que são do curso de Ciência da Computação.
aluno(id, nome, turma_id, mensalidade)
turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Estrutura PLPG/SQL Label só é necessário se quiser identificar o nome do bloco para usá-lo no EXIT; Ou para qualificar os nomes das variáveis que são usadas dentro do bloco. O comando possui um bloco, que pode possuir vários sub- blocos. Estrutura PLPG/SQL Declarações Todas as variáveis utilizadas dentro de um bloco devem ser declaradas neste. A exceção são as variáveis de loop para o FOR, onde a variável utilizada como contador é declarada automaticamente como inteiro. Exemplos: Declarações Sintaxe:
Uma variável pode ser constante;
Pode ser NÃO NULA; Não precisa ter um valor inicial, com exceção que seja NOT NULL; Pode ter um valor default e também um valor inicial. Declarações Exemplos Declarações Para parâmetros de funções, os nomes dos parâmetros sao $1, $2, etc. Podem-se também criar um ALIAS, de duas formas: Declarações Parâmetros de saída. (out) Declarações Copiando tipos TYPE
ROWTYPE
Tipo de Registro - RECORD
São similares as variáveis rowtype, porém não possuem uma estrutura pré-definida. Esta vai ser definida apenas quando inicializada em um select ou loop. Comandos Atribuição A expressão deve retornar um único valor (incluindo um valor de registro - record) Se o resultado da expressão não tiver o mesmo tipo da variável, então o interpretador converte implicitamente. (Pode gerar erros na execução) Comandos Consultas com apenas um registro de resultado podem ser atribuídas a variáveis do tipo record, row-type e lista de escalares. Quando o destino é uma varável record, ela automaticamente configura suas colunas; Comandos Retorna o primeiro ou null Comandos Com o comando strict, pode se assegurar que a consulta retornará apenas um comando Ex3) Para o modelo abaixo, crie uma função SQL que calcule retorne o nome do aluno que possui a maior média do curso de Ciência da Computação
aluno(id, nome, turma_id, mensalidade)
turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Ex3) Para o modelo abaixo, crie uma função SQL que retorne o nome do aluno, passando o ID do aluno como parâmetro.
aluno(id, nome, turma_id, mensalidade)
turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Condicionais Condicionais Ex3b) Para o modelo abaixo, crie uma função SQL que a partir do ID de uma turma passada por parâmetro, verifica quantos alunos estão presentes nessa turma.
aluno(id, nome, turma_id, mensalidade)
turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Ex3c) Para o modelo abaixo, crie uma função SQL que a partir do ID de uma turma e um valor de nota passados por parâmetro, verifica quantos alunos estão presentes nessa turma com uma nota maior ou igual a nota do parâmetro.
aluno(id, nome, turma_id, mensalidade)
turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Ex3d) Para o modelo abaixo, crie uma função SQL que a partir de dois IDs de turmas passados por parâmetros, imprime o aluno com maior média em cada turma e, por fim, imprime a turma do aluno com maior média entre os dois.
aluno(id, nome, turma_id, mensalidade)
turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Comando dinâmico A consulta pode ser diferente a cada vez que é executada Parâmetros podem ser utilizados apenas para dados Ex4) Para o modelo abaixo, crie uma função SQL que dinamicamente retorne e a quantidade de registros de uma tabela e filtro do where passados por parâmetro.
aluno(id, nome, turma_id, mensalidade)
turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Estruturas de Controle Para retornar o valor para uma função
Quando a função é declarada como retorno de SETOF
<algumtipo>. Pode ser retornada utilizando: RETURN NEXT RETURN QUERY RETURN na chamada definitiva Comando dinâmico Ex5) Para o modelo abaixo, crie uma função SQL que percorra todas as turmas, e retorne as turmas que possuem uma quantidade de alunos maior que 2.
ultima_nota) aluno(id, nome, turma_id, mensalidade) turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Ex6) Para o modelo abaixo, crie uma função SQL que, para cada aluno que tenha uma media de notas menor do que 5, seja gerado um registro na tabela de advertencia com o dia de hoje, id do aluno, media do aluno e a nota da ultima prova realizada pelo aluno. Essa função também deve verificar se a última nota desse aluno foi menor que 3, se sim, deve ser atualizada essa nota para 0.
aluno(id, nome, turma_id, mensalidade) turma(id, descricao) prova(id, aluno_id, nota) curso(id, nome) turma_curso(id, turma_id, curso_id) Ex7) Para o modelo abaixo, crie uma função SQL que, para cada aluno que tenha uma media de notas menor do que 5, seja gerado um registro na tabela de advertencia com o dia de hoje, id do aluno, media do aluno e a nota da ultima prova realizada pelo aluno.