Tecnologia em Análise e Desenvolvimento de Sistemas Disciplina: B1SGB - Sistemas Gerenciadores de Banco de Dados Memória de aula Semana 17 1) Expressões CASE a. Tem a mesma finalidade que nas linguagens de programação, fazer seleção a partir de um valor dado/especificado (estrutura de controle). b. Com seu uso é possível economizar muitas linhas de código. c. Pode ser usada com as cláusulas SELECT e UPDATE. d. É usado numa situação em que um valor precisa ser testado. e. Sintaxe: SELECT colunas, CASE WHEN condição THEN ação... [ELSE condição padrão] FROM tabela f. Exemplo: verificar condição de aprovação de alunos SELECT RA, Nome, Nota, CASE WHEN nota >= 7 THEN Aprovado WHEN nota >=3 AND nota <7 THEN Exame Final ELSE Reprovado as Situacao FROM HistoricoApBD
Resultado da query RA Nome Nota Situacao 4563 João da Silva 6.9 Exame Final 7858 Matheus Souza 8.8 Aprovado 9209 Maria da Luz 2.0 Reprovado 3490 Luzia Videira 3.4 Exame Final g. Pode-se utilizar o mesmo comando com a cláusula UPDATE. h. Exemplo: UPDATE aluno SET nota = CASE WHEN frequencia > 80 and aval_cont = 3 THEN 10 WHEN frequencia >80 and aval_cont = 2 THEN 8.5 WHEN frequencia > 80 and aval_cont < 2 THEN 7 ELSE 0 i. Case compacto: quando precisamos testar apenas uma coluna, podemos usar o case compacto, colocando o nome da coluna que precisamos avaliar após a palavra CASE. j. O teste será apenas de IGUALDADE. Nenhum operador é utilizado. k. Exemplo SELECT nome, CASE classificação WHEN 1 THEN Muito Bom WHEN 2 THEN Bom WHEN 3 THEN Regular
WHEN 4 THEN Deficiente ELSE Ruim FROM produto 2) Gatilhos (Triggers) a. Tipo de procedimento armazenado que é executado automaticamente quando ocorre algum tipo de alteração numa tabela b. Geralmente gatilhos são usados para reforçar restrições de integridade que não podem ser tratadas pelos recursos mais simples, como regras, defaults, restrições, a opção NOT NULL. c. Um gatilho também pode ser usado para calcular e armazenar valores automaticamente em outra tabela. d. Gatilhos são sempre criados vinculados a uma determinada tabela. Se a tabela for excluída, todos os gatilhos dela são excluídos como conseqüência. Ao criar um gatilho, você pode especificar qual(is) a(s) operação(ões) em que ele será acionado: INSERT, UPDATE ou DELETE. e. Exemplos: create trigger ExclusaoNota on NotaFiscal for delete as delete from ItemNotaFiscal where NumeroNota in (select NumeroNota from deleted) f. Um gatilho pode ser criado para uma tabela para múltiplas operações nessa tabela. Por exemplo, para criar um gatilho
usado em INSERT, UPDATE e DELETE, usa-se uma sintaxe, como: create trigger <nome_do_gatilho> on <nome_da_tabela> for INSERT, UPDATE, DELETE as <texto_do_gatilho> 3) Procedimentos (Stored Procedures) a. É um conjunto de comandos SQL, ao qual é atribuído um nome, que são compilados e armazenados no servidor. Ele pode ser chamado a partir de um comando SQL qualquer. b. A utilização de Stored Procedures é uma técnica eficiente para executarmos operações repetitivas. Ao invés de digitar os comandos cada vez que determinada operação necessite ser executada, cria-se um Stored Procedure e o chamamos. Em um Stored Procedure também podemos ter estruturas de controle e decisão, típicas das linguagens de programação. c. Sintaxe: CREATE PROCEDURE nome_do_stored_procedure [ {@parametro tipo_de_dados_parametro}[=valor_default] [output] ] [,...n] AS comando1, comando2, comando3,..., comando2 GO
d. Em um Stored Procedure podemos referenciar Tabelas, Views, outras Stored Procedures e tabelas temporárias. e. Criando SP: CREATE PROC ou CREATE PROCEDURE f. Exemplo: criar um Stored Procedure que retorne todos os registros da tabela orders, em que o campo ShipCountry é igual a London. Gravar o Stored Procedure com o nome SP_PedidosLondon. O mesmo será criado no Banco de Dados Northwind USE Northwind GO CREATE PROCEDURE SP_PedidosLondon AS SELECT * FROM Orders WHERE ShipCity = 'London' g. Para executar: exec SP_PedidosLondon h. Criando uma procedure com parâmetros de entrada create procedure BuscaCliente @nomebusca varchar(50) as select CodCliente, Nome from Cliente where Nome like '%' + @nomebusca + '%' i. Dentro do procedimento pode haver vários comandos SELECT e o resultado desses comandos será o resultado do procedimento. O corpo do procedimento começa com a palavra AS e vai até o final do procedimento. j. Execução de SP: i. EXEC BuscaCliente @nomebusca = 'an': explicita o valor de cada variável/parâmetro.
ii. Se não quiser colocar os nomes das variáveis, terá de indicar os valores na mesma ordem em que as variáveis foram criadas no Stored Procedure. k. Usando estruturas de decisão (if - else) i. Exemplo USE Northwind GO CREATE PROCEDURE sp_exif @pais1 nvarchar(15), @pais2 nvarchar(15), AS /* CRIA AS VARIAVEIS LOCAIS */ DECLARE @TotPed1 int, @TotPed2 int DECLARE @mensagem1 Char(100), @mensagem2 Char(100) DECLARE @mensagem2 CHAR(100) /* DEFINE O VALOR DE CADA VARIÁVEL */ SET @TotPed1 = (SELECT Count(OrderID) FROM Orders WHERE ShipCountry=@pais1) SET @TotPed2 = (SELECT Count(OrderID) FROM Orders WHERE ShipCountry=@pais2) /* EXECUTO O TESTE, UTILIZANDO IF...ELSE */ IF (@TotPed1) > (@TotPed2) BEGIN SET @mensagem1 = 'O Número de pedidos do primeiro país é maior' PRINT(@mensagem1) ELSE IF (@TotPed1) < (@TotPed2) BEGIN SET @mensagem2 = 'O número de pedidos do segundo país é maior' PRINT(@mensagem2) ELSE
BEGIN SET @mensagem3 = 'O número de pedidos dos dois países é igual' PRINT(@mensagem3) l. Estrutura de controle de laço (While): Esta esturura faz com que um conjunto de comandos continue sendo executado, enquanto uma determinada condição for verdadeira. i. Sintaxe: WHILE Teste BEGIN Comando1 Comando2 Comando3... ComandoN ii. Exemplo USE Northwind GO CREATE PROCEDURE sp_calculasoma @numero int AS /*CRIA AS VARIÁVEIS PARA UM CONTROLE DE LAÇO INICIALIZA A VARIÁVEL COM O VALOR 1 */ DECLARE @contador int SET @soma=0 WHILE (@contador<=numero) BEGIN SET @soma=@soma+@contador INSERT INTO SomaNaturais VALUES (@contador,@soma) SET @contador = @contador+1 iii. Para executar: EXEC sp_calculasoma 10 m. Cursor: é um recurso muito utilizado com comandos de controle de laço (loop - while). O cursor recebe o resultado
de uma consulta (select) e é tratado como um resultset (tabela de resultados) para ser explorado dentro de um while. n. Para usar o cursor, é preciso declará-lo com um nome, relacioná-lo a uma consulta (select). Em seguida, deve-se abri-lo, e usar a função fetch para acessar um registro. No final, o cursor deve ser fechado. Veja em seguida, um exemplos de stored procedures com cursor. i. Exemplo /* Same as previous example, this time using a cursor. Each update commits as it is made. */ create procedure increase_price_cursor as declare @price money /* declare a cursor for the select from titles */ declare curs cursor for select price from titles for update of price /* open the cursor */ open curs /* fetch the first row */ fetch curs into @price /* now loop, processing all the rows ** @@FETCH_STATUS = 0 means successful fetch ** @@FETCH_STATUS = 1 means error on previous fetch ** @@FETCH_STATUS = 2 means end of result set reached */ while (@@FETCH_STATUS!= 2) begin /* check for errors */ if (@@FETCH_STATUS = 1) begin print 'Error in increase_price'
end return /* next adjust the price according to the criteria */ if @price > $60 select @price = @price * 1.05 else if @price > $30 and @price <= $60 select @price = @price * 1.10 else if @price <= $30 select @price = @price * 1.20 /* now, update the row */ update titles set price = @price where current of curs /* fetch the next row */ fetch curs into @price end /* close the cursor and return */ CLOSE curs DEALLOCATE curs Fonte deste exemplo: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20020_1251/html/databases/x61512.htm (adaptado) Bibliografia ELMASRI, R., NAVATHE, S.B. Sistemas de Banco de Dados. 4ª Ed. São Paulo: Pearson Makron Books, 2005.
Exercícios Baseando-se no Modelo de Dados implementado em laboratório, efetue as consultas abaixo. 1) Faça uma lista que mostre o código e o endereço do imóvel e aplique um desconto no preço do imóvel seguindo estas condições: a. Caso o preço do imóvel seja maior que 100 mil, desconto de 10%. b. Caso seja maior que 50 mil e menor ou igual a 100 mil, desconto de 5%. c. Caso seja maior que 30 mil e menor ou igual a 50 mil, desconto de 3%. d. Não aplicar desconto a imóveis com valor igual ou menor a 30 mil. 2) Faça uma lista que mostre o endereço do imóvel e o código do vendedor, e que, caso o campo STVIDO tenha conteúdo S, escreva VIDO, e do contrário, escreva DISPONÍVEL. 3) Crie um trigger que apague (em cascata) todas as ofertas de um comprador quando este for excluído do banco de dados. Atenção: para funcionar na prática, deverá ser desligada a integridade referencial entre as tabelas COMPRADOR e OFERTA. 4) Elabore um stored procedure que, dados os códigos de dois imóveis, o segundo imóvel seja setado como imóvel indicado do primeiro, se o imóvel estiver com o campo imóvel_indicado nulo. Retorne uma mensagem avisando se foi possível fazer a alteração. 5) Elabore um stored procedure que, dado três códigos de imóveis, indique aquele que tem mais ofertas. 6) Qual vendedor tem mais imóveis para vender em valor (preço), não necessariamente em quantidade. Retorne código e nome do vendedor. Baseado em: OLIVEIRA, C. H. P. SQL curso prático. Novatec, 2002.