Вы находитесь на странице: 1из 49

Banco de Dados

Introdução à Linguagem PL/SQL


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.

advertencia(id, data_advertencia, aluno_id, media,


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.

advertencia(id, data_advertencia, aluno_id, media, 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)
 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.

advertencia(id, data_advertencia, aluno_id, media, 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)
Loops
 Exit
 Continue
Cursores
 Podem ser declarados de três formas
Cursores
 Ligando cursores
Cursores
 Ligando cursores
 Só reposiciona o cursor
 Atualizar, excluir com um cursor

 Fechar um cursor
Triggers

Вам также может понравиться