Monitoria GDI Aula Prática. DML + PL/SQL parte 1



Documentos relacionados
Bancos de Dados I. Integridade semântica

Comandos de Manipulação


PL/SQL. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados PL/SQL

Laboratório de Banco de Dados Prof. Luiz Vivacqua. PL/pgSQL A Linguagem de programação do PostgreSQL

RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve

SQL Procedural. Josino Rodrigues Neto

Logado no OracleXE vamos acessar a opção:

PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

Oracle 10g: SQL e PL/SQL

SQL Linguagem de Manipulação de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

PL/pgSQL por Diversão e Lucro

Oracle PL/SQL Overview

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

Banco de Dados. Marcio de Carvalho Victorino Exercícios SQL

2. Criar um bloco PL/SQL anônimo para imprimir as tabuadas abaixo: 5 X 10 = 50 5 X 2 = X 10 = X 2 = 2...

Linguagem PL/SQL e Triggers

Ex.: INSERT INTO tmpautor (CDAUTOR, NMAUTOR) VALUES (1, Renato Araújo )

Sistemas de Informação

BANCO DE DADOS -INTRODUÇÃO AO SQL. Prof. Angelo Augusto Frozza, M.Sc.


SQL Gatilhos (Triggers)

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas

Introdução à Banco de Dados. Nathalia Sautchuk Patrício

PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger

FUNCTION ) RETURNS INTEGER AS $$ DECLARE

Banco de Dados I Linguagem SQL Parte 2. Autor: Prof. Cláudio Baptista Adaptado por: Prof. Ricardo Antonello

Bases de Dados 2007/2008. Aula 9

SQL DML. Frederico D. Bortoloti

Structured Query Language (SQL)

Relatório. Projecto de Base de Dados Parte 2. Turno: quinta-feira, 11:30 Grupo 25: André Gonçalves Rui Barradas Hélton Miranda 68477

SQL TGD/JMB 1. Projecto de Bases de Dados. Linguagem SQL

Bases de Dados 2005/2006. Aula 5

FERRAMENTA DE APOIO A REESTRUTURAÇÃO DE CÓDIGO FONTE EM LINGUAGEM PL/SQL BASEADO EM PADRÕES DE LEGIBILIDADE

Introdução à linguagem SQL

IF685 Gerenciamento de Dados e Informação - Prof. Robson Fidalgo 1

3) Palavra-chave distinct (select-from). Obter apenas os pibs distintos entre si.

Triggers no PostgreSQL

Linguagem de Consulta Estruturada SQL- DML

Pontifícia Universidade Católica do Rio Grande do Sul FACULDADE DE INFORMÁTICA PROGRAMA DE PÓS-GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO.

ANÁLISE E PROJETO DE BANCO DE DADOS

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

Formação em Banco de Dados

BANCO DE DADOS. info 3º ano. Prof. Diemesleno Souza Carvalho

Sumário Introdução Breve História da Linguagem SQL l 0.3 Características da Linguagem SQL A Composição deste Livro 3

Faculdade Pitágoras 16/08/2011. Curso Superior de Tecnologia: Banco de Dados Sistemas para Internet

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

Prova de Fundamentos de Bancos de Dados 2 a Prova

PHP INTEGRAÇÃO COM MYSQL PARTE 1

UNIVERSIDADE FEDERAL DE SANTA MARIA - UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN BANCO DE DADOS II

SQL. Prof. Márcio Bueno.

Ex.: INSERT INTO tmpautor (CDAUTOR, NMAUTOR) VALUES (1, Renato Araújo )

Treinamento sobre SQL

AULA 8 CRIANDO UMA CLASSE EM PHP INTERAGINDO COM BANCO DE DADOS - COM RELACIONAMENTO ENTRE TABELAS

Bases de Dados 2007/2008. Aula 8

SQL (Structured Query Language)

Banco de Dados. Maurício Edgar Stivanello

Bases de Dados 2012/2013 Funções/procedimentos e triggers. Helena Galhardas 2012 IST. Bibliografia. Manual referência PostgreSQL

PL/pgSQL. Introdução. Introdução. Introdução

Faculdade Pitágoras. Curso Superior de Tecnologia: Banco de Dados. Disciplina: Banco de Dados Prof.: Fernando Hadad Zaidan SQL

Projeto de Banco de Dados

Banco de Dados Avançados Banco de Dados Ativo

SQL comando SELECT. SELECT [DISTINCT] <campos> FROM <tabela> [condição] [ ; ] Paulo Damico - MDK Informática Ltda.

Definida pelo American National Standard Institute (ANSI) em 1986

Create Sequence Cria uma sequence. Uma sequence é um objeto que permite vários usuários gerarem valores inteiros sem repetição.

Tarefa Orientada 19 Triggers

Banco de Dados Oracle 10g: Introdução à Linguagem SQL

Formação em Banco de Dados. Subtítulo

EXERCÍCIOS PRÁTICOS. Banco de Dados

PROCEDIMENTOS ARMAZENADOS (Stored Procedures)

O que são Bancos de Dados?

PROGRAMA. Objectivos Gerais :

Linguagem de Consulta - SQL

Memória de aula Aulas 11 e 12

Álgebra Relacional. Conjunto de operações que usa uma ou duas relações como entrada e gera uma relação de saída. Operações básicas:

Introdução à Engenharia da Computação. Banco de Dados Professor Machado

EXEMPLOS DE COMANDOS NO SQL SERVER

Texto Base Livro texto: SQL Guia Prático 2ª Edição Rogério Luís de C. Costa. Banco de Dados II Comando Select. Gustavo Dibbern Piva

Exercícios com o intuito de cobrar todos os assuntos vistos em sala, relativos à Modelagem Conceitual, SQL, PL e XML. 1ª ETAPA

Tratamento de Exceções

Introdução ao SQL. Aécio Costa

A linguagem SQL

Memória de aula Semanas 15 e 16

Programação SQL. INTRODUÇÃO II parte

SQL Structured Query Language

SQL - Structured Query Language, ou Linguagem de Consulta Estruturada ou SQL

SQL Avançado Continuação. Renata Viegas

Banco de Dados. Prof. Antonio

Reforçando conceitos de SQL Estudo de Caso: Agenciamento de Corridas de Táxis

Material Teórico. Procedures, Functions, Exceptions e Triggers. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

GBC043 - Sistemas de Banco de Dados Funções e Gatilhos no PostgreSQL

Transcrição:

Monitoria GDI Aula Prática DML + PL/SQL parte 1

DML linguagem de manipulação de dados

SQL Estrutura básica de uma consulta SQL SELECT Coluna1[,Coluna2[,Coluna3[,...]]] FROM Tabela1[,Tabela2[,...]] WHERE Condição

SQL Estrutura genérica de uma consulta SQL SELECT [DISTINCT ALL] {* [Tabela.]Coluna1 [AS Alias1] [[Tabela.]Coluna2 [AS Alias2] [,...]]} FROM Tabela1[,Tabela2[,...]] [WHERE {Condição Simples Condição de Sub-consulta}] [ORDER BY Coluna1 [ASC DESC] [,Coluna2 [ASC DESC] [,... ]]] [GROUP BY Coluna1 [,Coluna2[,...]] [HAVING Condição]] [{UNION INTERSECT EXCEPT} SELECT...]

Exercício 1 Selecione a matrícula e o nome de todas as mulheres, ordenando-as por ordem alfabética.

Exercício 1 Selecione a matrícula e o nome de todas as mulheres, ordenando-as por ordem alfabética. SELECT nome, matricula_pessoa FROM Pessoa WHERE Sexo = 'M' ORDER BY nome;

Exercício 2 Repita a operação anterior exibindo apenas aquelas que são professoras.

Exercício 2 Repita a operação anterior exibindo apenas aquelas que são professoras. SELECT nome, matricula_pessoa FROM pessoa, professor WHERE matricula_pessoa = matricula_professor AND Sexo = 'M' ORDER BY nome;

Exercício 3 Quais são as disciplinas que o professor 'Sirenio Arruda' está ministrando atualmente?

Exercício 3 Quais são as disciplinas que o professor 'Sirenio Arruda' está ministrando atualmente? SELECT M.codigo_disciplina FROM Ministra M, Pessoa P, Professor PR WHERE M.matricula_professor = PR.matricula_professor AND PR.matricula_professor = P.matricula_pessoa AND P.nome = 'Sirenio Arruda' AND M.ano_semestre = '2010.2';

Exercício 4 Repita a consulta anterior utilizando JOIN.

Exercício 4 Repita a consulta anterior utilizando JOIN. SELECT M.codigo_disciplina FROM Ministra M INNER JOIN Professor PR ON M.matricula_professor = PR.matricula_professor INNER JOIN Pessoa P ON PR.matricula_professor = P.matricula_pessoa WHERE P.nome = 'Sirenio Arruda' AND M.ano_semestre = '2010.2';

Exercício 5 Para as disciplinas de código 1, 2 e 3, mostre quais alunos já foram seus monitores. (Use IN)

Exercício 5 Para as disciplinas de código 1, 2 e 3, mostre quais alunos já foram seus monitores. (Use IN) SELECT DISTINCT P.nome FROM Pessoa P INNER JOIN Aluno A ON P.matricula_pessoa = A.matricula_aluno INNER JOIN Monitoria M ON M.matricula_aluno = A.matricula_aluno WHERE M.codigo_disciplina IN (1,2,3);

Exercício 6 Mostre os nomes de TODOS os professores e, caso existam, os nomes dos seus líderes.

Exercício 6 Mostre os nomes de TODOS os professores e, caso existam, os nomes dos seus líderes. SELECT P1.nome, P2.nome as lider FROM Pessoa P1 INNER JOIN Professor PR ON P1.matricula_pessoa = PR.matricula_professor LEFT OUTER JOIN Pessoa P2 ON PR.matricula_lider = P2.matricula_pessoa;

Exercício 7 Mostre os alunos que não têm nenhum projeto. Exiba também as informações de quando eles pagaram a cadeira. (Use IS NULL)

Exercício 7 Mostre os alunos que não têm nenhum projeto. Exiba também as informações de quando eles pagaram a cadeira. (Use IS NULL) SELECT a.matricula_aluno, at.codigo_curso, at.codigo_disciplina, at.ano_semestre FROM aluno a, aluno_turma at WHERE a.matricula_aluno = at.matricula_aluno AND at.codigo_projeto IS NULL ORDER BY a.matricula_aluno, at.ano_semestre;

Exercício 8 Selecione todos os professores, exceto aqueles que entraram entre 1995 e 2005. (Use BETWEEN)

Exercício 8 Selecione todos os professores, exceto aqueles que entraram entre 1995 e 2005. (Use BETWEEN) SELECT * FROM professor WHERE data_admissao NOT BETWEEN to_date('1999', 'yyyy') AND to_date('2005', 'yyyy');

Exercício 9 Mostre quantas vezes que o professor 'Jose Alcantara' já esteve a lecionar

Exercício 9 Mostre quantas vezes que o professor 'Jose Alcantara' já esteve a lecionar SELECT COUNT(M.codigo_disciplina) FROM Pessoa P INNER JOIN Professor PR ON P.matricula_pessoa = PR.matricula_professor INNER JOIN Ministra M ON M.matricula_professor = PR.matricula_professor WHERE P.nome = 'Jose Alcantara';

Exercício 10 Mostre a média das notas dos alunos agrupadas por período.

Exercício 10 Mostre a média das notas dos alunos agrupadas por período. SELECT ano_semestre, AVG(nota) FROM Prova GROUP BY ano_semestre;

Exercício 11 Considere um relatório e mostre, numa mesma consulta, para o semeste '2009.1', os registros dos professores em todas as ministrações que realizaram mais os registros dos alunos nas vezes em que pagaram alguma cadeira. Exiba o código da disciplina, o código do curso e a matrícula do professor ou do aluno que realizou a atividade. (Realize SELECTS independentes e use UNION)

Exercício 11 Considere um relatório e mostre, numa mesma consulta, para o semeste '2009.1', os registros dos professores em todas as ministrações que realizaram mais os registros dos alunos nas vezes em que pagaram alguma cadeira. Exiba o código da disciplina, o código do curso e a matrícula do professor ou do aluno que realizou a atividade. (Realize SELECTS independentes e use UNION) (SELECT matricula_professor AS matricula, codigo_disciplina, codigo_curso FROM ministra WHERE ano_semestre = '2009.1') UNION (SELECT matricula_aluno AS matricula, codigo_disciplina, codigo_curso FROM aluno_turma WHERE ano_semestre = '2009.1');

PL/SQL Procedural Language/ Structured Query Language

PROCEDURE Por padrão não retornam valor (exceção: modo OUT ou IN OUT). Estrutura básica de um PROCEDURE PROCEDURE nome IS BEGIN [EXCEPTION] END;

FUNCTION Por padrão, necessariamente, retornam um único valor. Estrutura básica de uma FUNCTION FUNCTION nome RETURN tipo IS BEGIN RETURN valor [EXCEPTION] END;

Exercício 12 Admita que cada uma das cadeiras que um aluno paga vale 5 créditos, que cada projeto vale 1 e que cada monitoria vale 2 créditos. Implemente uma função que, dado um número de matrícula, retorna os créditos totais da carreira estudantil do aluno.

Exercício 12 Admita que cada uma das cadeiras que um aluno paga vale 5 créditos, que cada projeto vale 1 e que cada monitoria vale 2 créditos. Implemente uma função que, dado um número de matrícula, retorna os créditos totais da carreira estudantil do aluno. CREATE OR REPLACE FUNCTION qtd_creditos (mat aluno.matricula_aluno%type) RETURN NUMBER IS retorno NUMBER;

BEGIN SELECT COUNT(a_t.matricula_aluno)*5 + COUNT(a_t.codigo_projeto)*1 + COUNT(m.matricula_aluno)*2 INTO retorno FROM aluno_turma a_t, monitoria m, aluno a WHERE a.matricula_aluno = a_t.matricula_aluno AND m.matricula_aluno = a.matricula_aluno AND a.matricula_aluno = mat; RETURN retorno; END; / --TESTANDO SELECT qtd_creditos(9999) FROM DUAL;

Exercício 13 Implemente um procedimento que recebe como parâmetro de entrada um título de um projeto e imprime os seus dados.

Exercício 13 Implemente um procedimento que recebe como parâmetro de entrada um título de um projeto e imprime os seus dados. CREATE OR REPLACE PROCEDURE pesquisa_projeto (par_titulo IN projeto.titulo%type) IS v_codigo_projeto projeto.codigo_projeto%type; v_titulo projeto.titulo%type; v_conceito projeto.conceito%type; v_hp projeto.hp%type;

BEGIN SELECT codigo_projeto, titulo, conceito, hp INTO v_codigo_projeto,v_titulo,v_conceito,v_hp FROM projeto WHERE titulo LIKE par_titulo; dbms_output.put_line( 'COD: ' v_codigo_projeto ' - TIT: ' v_titulo ' - CON: ' v_conceito ' - HP: ' v_hp); END; / --TESTANDO EXECUTE pesquisa_projeto('rede Aberta');

Exercício 14 Implemente um novo procedimento, semelhante ao anterior, que seja mais genérico e pesquise todos os projetos que possuam o valor do parâmetro como substring do seu título. (Utilize LIKE '%' e CURSOR)

Exercício 14 Implemente um novo procedimento, semelhante ao anterior, que seja mais genérico e pesquise todos os projetos que possuam o valor do parâmetro como substring do seu título. (Utilize LIKE '%' e CURSOR) CREATE OR REPLACE PROCEDURE pesquisa_projeto_generico (par_titulo IN projeto.titulo%type) IS CURSOR cursor_projetos IS SELECT * FROM projeto WHERE LOWER(titulo) LIKE LOWER('%' par_titulo '%'); registro_projeto projeto%rowtype;

BEGIN OPEN cursor_projetos; LOOP FETCH cursor_projetos INTO registro_projeto; EXIT WHEN cursor_projetos%notfound; dbms_output.put_line( 'COD: ' registro_projeto.codigo_projeto ' - TIT: ' registro_projeto.titulo ' - CON: ' registro_projeto.conceito ' - HP: ' registro_projeto.hp); END LOOP; CLOSE cursor_projetos; END; / --TESTANDO EXECUTE pesquisa_projeto_generico('cin');

Exercício 15 Crie um PROCEDURE que recebe um VARCHAR do tipo ano_semestre e produz dois parâmetros numéricos de saída: ano e semestre;

Exercício 15 Crie um PROCEDURE que recebe um VARCHAR do tipo ano_semestre e produz dois parâmetros numéricos de saída: ano e semestre; CREATE OR REPLACE PROCEDURE desmembra_semestre (ano_semestre IN turma.ano_semestre%type, ano OUT NUMBER, semestre OUT NUMBER) IS BEGIN ano := SUBSTR(ano_semestre,1,4); semestre := SUBSTR(ano_semestre,6,1); END; /

Exercício 16 Implemente uma FUNCTION que receberá o código de uma disciplina e retornará uma STRING com todos os ANOS em que ela foi ofertada no 1º semestre e todos os anos para o 2º semestre (EX: '1º: 1992; 1990; 2000; 2º: 1990; 2001;'). Crie uma tabela (IS TABLE OF) com registros do tipo (IS RECORD [cod_curso, ano, semestre]) que receberá as informações de todas as turmas que já existiram e utilize o PROCEDURE anterior para separar os campos ano_semestre. Em seguida, verifique um a um os registros da tabela já povoada e vá preenchendo a variável de retorno.

CREATE OR REPLACE FUNCTION anos_por_semestre (cod disciplina.codigo_disciplina%type) RETURN VARCHAR2 IS TYPE TIPO_TURMA_COMPACTO IS RECORD (cod_curso turma.codigo_curso%type, ano NUMBER, semestre NUMBER); TYPE TIPO_TURMA_COMPACTO_TABELA IS TABLE OF TIPO_TURMA_COMPACTO; tab_compacto TIPO_TURMA_COMPACTO_TABELA := TIPO_TURMA_COMPACTO_TABELA(); anos1 VARCHAR2(100) := '1º: '; anos2 VARCHAR2(100) := '2º: ';

BEGIN FOR registro_turma IN (SELECT * FROM turma WHERE codigo_disciplina = cod ORDER BY codigo_curso) LOOP tab_compacto.extend; tab_compacto(tab_compacto.last).cod_curso := registro_turma.codigo_curso; desmembra_semestre(registro_turma.ano_semestre, tab_compacto(tab_compacto.last).ano, tab_compacto(tab_compacto.last).semestre); END LOOP;

WHILE tab_compacto.count > 0 LOOP IF(tab_compacto(tab_compacto.LAST).semestre = 1) THEN anos1 := anos1 tab_compacto(tab_compacto.last).ano '-' tab_compacto(tab_compacto.last).cod_curso '; '; ELSIF(tab_compacto(tab_compacto.LAST).semestre = 2) THEN anos2 := anos2 tab_compacto(tab_compacto.last).ano '-' tab_compacto(tab_compacto.last).cod_curso '; '; END IF; tab_compacto.trim(); END LOOP; END; / RETURN anos1 ' ' anos2; --TESTANDO SELECT anos_por_semestre(1) FROM DUAL;

TRIGGER Executado implicitamente pelo SGBD na ocorrência de um determinado evento ou combinação deste. Estrutura básica de um TRIGGER CREATE [OR REPLACE] TRIGGER nome_trigger momento evento1 [OR evento2 OR evento3] [OF coluna] ON nome_objeto [[REFERENCING OLD AS apelido1 NEW AS apelido2] FOR EACH ROW [WHEN (condição)]] corpo_trigger

Exercício 17 Criar um TRIGGER que faça um comparativo entre os ANTIGOS e NOVOS valores logo após inserção, atualização ou deleção de um projeto.

Exercício 17 Criar um TRIGGER que faça um comparativo entre os ANTIGOS e NOVOS valores logo após inserção, atualização ou deleção de um projeto. CREATE OR REPLACE TRIGGER controle_projetos AFTER INSERT OR UPDATE OR DELETE ON PROJETO FOR EACH ROW BEGIN dbms_output.put_line('<<dados ANTIGOS>>'); dbms_output.put_line('cod: ' :OLD.codigo_projeto); dbms_output.put_line('tit: ' :OLD.titulo); dbms_output.put_line('con: ' :OLD.conceito); dbms_output.put_line('hp: ' :OLD.hp); dbms_output.put_line(' ');

dbms_output.put_line('<<dados NOVOS>>'); dbms_output.put_line('cod: ' :NEW.codigo_projeto); dbms_output.put_line('tit: ' :NEW.titulo); dbms_output.put_line('con: ' :NEW.conceito); dbms_output.put_line('hp: ' :NEW.hp); END; / --TESTANDO INSERT INTO projeto(codigo_projeto,titulo, conceito,hp) VALUES (21,'BiosFera','RUIM', 'www.cin.ufpe.br/~biosfera'); UPDATE projeto SET titulo = 'Bioma Protection', hp = 'www.biomaprotection.com', conceito = 'BOM' WHERE codigo_projeto = 21; DELETE projeto WHERE codigo_projeto = 21;

Exercício 18 Implemente um TRIGGER que não permita que um professor coordene mais do que uma disciplina. Caso alguma irregularidade ocorra, imprima uma mensagem do tipo "RAISE APPLICATION ERROR".

Exercício 18 Implemente um TRIGGER que não permita que um professor coordene mais do que uma disciplina. Caso alguma irregularidade ocorra, imprima uma mensagem do tipo "RAISE APPLICATION ERROR". CREATE OR REPLACE TRIGGER controle_coordenacao BEFORE INSERT ON disciplina FOR EACH ROW DECLARE coordenador disciplina.matricula_professor%type;

BEGIN SELECT matricula_professor INTO coordenador FROM disciplina WHERE matricula_professor = :NEW.matricula_professor; IF coordenador IS NOT NULL THEN RAISE_APPLICATION_ERROR(-20101,'ESTE PROFESSOR JA COORDENA UMA DISCIPLINA'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('coordenacao ACEITA'); END; / --TESTANDO INSERT INTO disciplina (codigo_disciplina, ementa, conteudo_programatico, matricula_professor)values (7,'E7', 'C7',1111);

Monitoria GDI Aula Prática DML + PL/SQL parte 1