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

Laboratrio de Banco de Dados II

Cursor em Bancos de dados - Continuao


Cursores aninhados
Na ltima aula, voc aprendeu o significado de cursor em banco de dados e utilizou esta estrutura para obter um resultado especfico. Naquele momento, voc entendeu que o cursor permite tratar os elementos de um conjunto de tuplas de uma forma ligeiramente diferente daquela a que estava acostumado. Ou seja, os comandos SQL tratam conjuntos de linhas e com a estrutura de cursor, possvel tratar, individualmente, cada linha de um conjunto. O conjunto de dados de um cursor definido logicamente no momento da sua declarao por meio da associao com o comando select, mas este no o momento da definio de quais dados sero tratados pelo cursor. Em outras palavras, na definio do cursor no realizada a seleo dos dados, apenas a definio do comando que ser avaliado posteriormente. O comando select associado ao cursor ser avaliado para a determinao dos dados no momento em que emitido o comando open. Em outras palavras, este comando estabelece as linhas que sero tratadas pelo cursor aplicando o comando select associado declarao do cursor. Cada uma dessas linhas/tuplas obtida com o comando fetch. Vamos trabalhar com este elemento, novamente, na aula de hoje. Na aula passada, voc trabalhou com dois cursores de forma sequencial. Na aula de hoje, voc trabalhar com cursores aninhados. Ficar mais claro no exemplo da atividade. Abrindo um parntesis, para uma eventual utilizao, voc pode verificar a existncia de dados que obedece a determinada condio com a clusula
exists.

Algo como,
. . . . where [not] exists (select 1 from . . . .)

Pode ser igualmente utilizado com o comando


if,

que faz parte da linguagem de um SQL Batch.

Atividade I Cursores aninhados

Considere o diagrama de entidades e relacionamentos (DER) e o correspondente diagrama relacional:

Os esquemas relacionais so os seguintes:


Pesquisadores=(cod_pesq, nome_pesq, remuneracao, dt_nasc) Grupos_Pesquisas=(cod_grupo, nome_grupo, descrio, data_inicio, [data_fim]) Pesq_Grupos=(cod_pesq, cod_grupo, [papel_grupo])

1. Crie as tabelas abaixo correspondente implementao fsica dos esquemas relacionais:

a) tb_pesquisadores

Coluna cod_pesq nome_pqr remuneracao dt_nasc

Tipo char(10) varchar(50) numeric date

Admite valores indefinidos No No No No

Obs Cdigo do pesquisador Nome do pesquisador Remunerao do pesquisador Data de nascimento

b) tb_grupos_pesquisas Admite valores indefinidos No No No No Sim

Coluna cod_grupo nome_grupo descricao data_inicio data_fim

Tipo char(10) varchar(30) Varchar(255) date date

Obs Cdigo do grupo de pesquisa Nome do grupo de pesquisa Descricao do grupo Data de incio do grupo Data final do grupo

a) tb_pesq_grupos Admite valores indefinidos No No Sim

Coluna cod_pesq cod_grupo papel_grupo

Tipo char(10) varchar(30) varchar(20)

Obs Cdigo do pesquisador Cdigo do grupo de pesquisa Cargo do pesquisador no grupo

2. Seguindo a notao para a restrio de chave primria, especifique-a para as tabelas criadas. Mais tarde, na aula de implementao de projeto de banco de dados, voc ter que especificar outros elementos, no entanto, neste momento, voc indicar somente a chave primria. 3. Inclua dados nas suas tabelas.

a) A coluna
papel_grupo

indica qual o papel que o pesquisador possui no grupo de pesquisa a que pertence. Teoricamente, pode pertencer a vrios grupos com papis diferentes em cada grupo. Eventualmente, um grupo pode ter somente um pesquisador. Inicialmente, quando a tabela foi carregada esta coluna no estava preenchida. Vamos preench-la segundo o seguinte critrio, por grupo, considerando a classificao da remunerao em ordem decrescente: O pesquisador com o maior salrio do grupo o lder do grupo; o segundo o vice-lder do grupo; e os demais so assistentes. Para os cargos de lder e vice-lder, o critrio de desempate a idade, privilegiando o mais idoso, considerando ano, ms e dia. Se tiverem o mesmo dia de nascimento, os pesquisadores com a mesma remunerao dentro grupo tero o mesmo cargo. Fica ressalvado que um pesquisador no pode liderar mais que um grupo. Desta forma, se ele pertencer a mais que um grupo e atender as qualificaes de liderana em ambos, ele ficar com o cargo de lder no grupo mais antigo e poder participar com outros cargos, inclusive como vice-lder, dos demais grupos. 4. Crie a procedure de nome
pr_atribui_papel_pesquisador_num_grupo

que atuar sobre os dados de um nico grupo. b) A procedure tem um parmetro de entrada: - Cdigo do grupo de pesquisa; c) Percorre os dados da tabela referente ao grupo de pesquisa recebido como parmetro e faz a atualizao da coluna
papel_grupo

da tabela
tb_pesq_grupos

com os seguinte papis:


Lder, Vice lder e Assistente.

Faa isto atravs de um cursor percorrendo os registros da tabela referentes aos pesquisadores do grupo corrente, em ordem adequada.

Se o grupo tiver apenas um pesquisador, ele o lder; no caso de dois pesquisadores, no existem pesquisadores assistentes. Se mais que um pesquisador possuir a mesma remunerao, o critrio de desempate a idade favorecendo o mais idoso. Persistindo o empate, ambos tero o mesmo cargo. 5. Crie uma segunda procedure de nome
pr_atribui_papel_pesquisador

que por meio de um cursor, percorre a tabela de grupos de pesquisa em ordem adequada. Esta procedure no possui parmetros. Trata cada um dos grupos de pesquisa e para cada um deles, invoca a procedure criada anteriormente passando como parmetro o grupo de pesquisa corrente. A sintaxe de invocao de procedure a seguinte:
exec pr_atribui_papel_pesquisador_num_grupo v_nummero_grupo

No coloque a sua procedure em loop infinito. Para executar:


exec pr_atribui_papel_pesquisador

Confira o resultado da execuo da sua procedure verificando os dados finais da sua tabela.

Atividade II
Pela estrutura da soluo anterior, voc pode ter ficado com a impresso de que necessrio utilizar procedures aninhadas para cursores aninhados. Mas isto no verdade. Para que isto fique claro, crie a procedure
pr_atribui_papel_pesquisador_v2

que faz a mesma tarefa anterior, mas utiliza os cursores aninhados dentro desta nica procedure. Basicamente, voc ter que deslocar o contedo do texto de uma procedure dentro da outra com alguns cuidados.

Atividade III
Numa das aulas anteriores, voc criou a procedure
pr_lista_dados_segunda_cidade

para apresentar a(s) cidades(s), que esto classificadas na segunda posio superior em nmero de habitantes, em relao cidade cujo cdigo foi recebido como parmetro. Na ocasio foi considerada a classificao em ordem crescente, ou seja, a(s) cidade(s) com o menor nmero de habitantes est(o) na primeira posio. Este mesmo critrio se aplica nesta atividade. Isto foi realizado, utilizando a estrutura
top n.

Hoje, voc criar a segunda verso desta procedure com o nome


pr_lista_dados_segunda_cidade_v2

que faz quase a mesma coisa, mas utiliza o recurso do


cursor.

Relembrando, os parmetros so:


Parmetro 1: cdigo da cidade de referncia; Parmetro 2: inteiro j para indicar que se desejam as cidades na j-sima posio superior em relao cidade recebida como parmetro.

Voc deve considerar que em razo do arredondamento do nmero de habitantes na ordem de 104, existem vrias cidades na mesma classificao. claro que se voc utilizar a tabela tb_cidades2 que foi classificada por habitantes na primeira aula sobre cursores, o resultado a este item pode ser facilmente obtido. No entanto, voc utilizar a tabela
tb_cidades1.

O enunciado o seguinte: Crie a procedure de nome


pr_lista_dados_segunda_cidade_v2

que, utilizando, adequadamente, a estrutura de cursor e considerando como referncia a cidade recebida no primeiro parmetro atravs do seu cdigo, apresenta todos os dados das

cidades que esto na j-sima posio superior em nmero de habitantes segundo o critrio de classificao citado acima. No coloque a sua procedure em loop infinito. Na verso anterior, voc utilizou a estrutura top n mais que uma vez para resolver este problema e, potencialmente, poderia ter que us-la muitas vezes, seguidamente, para apresentar os resultados esperados. Naquela ocasio, foi advertido de que no era a melhor soluo e invivel para grandes volumes. Faa uma reflexo sobre as duas formas de resolver o problema. Qual a considerao a fazer na comparao entre as duas estratgias?

At a prxima aula! Prof. Satoshi Nagayama

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