Prévia do material em texto
CIÊNCIA DA COMPUTAÇÃO AULA 09 LINGUAGEM DE PROGRAMAÇÃO DE BANCO DE DADOS 1 Decio 2 • Um cursor funciona como um conjunto de dados que mantém uma posição atual, à medida que o conjunto de resultados é percorrido; • Um cursor permite iterar um conjunto de linhas retornadas por uma consulta e processar, individualmente, cada linha; • Usar um cursor é como utilizar uma variável: 1) declare, 2) atribua um valor, 3) use-o. No entanto, é preciso liberar, explicitamente, a variável utilizada pelo cursor • Um cursor é somente leitura, não-rolável e assensível. O que são Cursores no SQL 3 Exemplo 4 • Declarar o cursor: • DECLARE nome_cursor CURSOR FOR comando_select • 2. Abrir o cursor: • OPEN nome_cursor • 3. Usar o cursor: • FETCH nome_cursor INTO lista_de_variáveis • 4. Fechar o cursor para liberar memória: • CLOSE nome_cursor O que são Cursores no SQL 5 Exemplo 6 Exemplo 7 Exemplo Um cursor é um ponteiro para esta área de contexto. PL/SQL controla a área de contexto por meio de um cursor. Um cursor mantém as linhas (uma ou mais) retornadas por uma instrução SQL. O conjunto de linhas que o cursor mantém é chamado de conjunto ativo. Para manipular um conjunto de resultados dentro de um procedimento armazenado, você usa um cursor. Um cursor permite que você itere um conjunto de linhas retornadas por uma consulta e processe cada linha adequadamente Cursores no SQL Os programadores não podem controlar os cursores implícitos e as informações neles. Cursor implícito é associado às seguintes instruções DML • INSERT, • UPDATE e • DELETE Em PL/SQL, você pode se referir ao cursor implícito mais recente como o cursor SQL, que sempre tem atributos como • %FOUND, • %ISOPEN, • %NOTFOUND e • %ROWCOUNT. Cursor implícito • Cursores explícitos são cursores definidos pelo programador para obter mais controle sobre a área de contexto. • Um cursor explícito deve ser definido na seção de declaração do Bloco PL/SQL. • Ele é criado em uma Instrução SELECT que retorna mais de uma linha. • Trabalhar com um cursor explícito inclui as seguintes etapas − 1. Declarar o cursor para inicializar a memória 2. Abrir o cursor para alocar a memória 3. Buscar o cursor para recuperar os dados 4. Fechar o cursor para liberar a memória alocada Cursor explícito Tipos de cursor no MySQL • Somente leitura: você não pode atualizar dados na tabela subjacente por meio do cursor. • Não rolável: você só pode buscar linhas na ordem determinada pela instrução SELECT. Você não pode buscar linhas na ordem inversa. Além disso, você não pode pular linhas ou pular para uma linha específica no conjunto de resultados. Tipos de cursor Existem dois tipos de cursores: cursor Asensitive e cursor Insensitive. Um cursor asensitive aponta para os dados reais, enquanto um cursor insensitive usa uma cópia temporária dos dados. Um cursor asensitive tem um desempenho mais rápido do que um cursor insensitive porque não precisa fazer uma cópia temporária dos dados. No entanto, qualquer alteração feita nos dados de outras conexões afetará os dados que estão sendo usados por um cursor asensitive, portanto, é mais seguro se você não atualizar os dados que estão sendo usados por um cursor asensitive. O cursor MySQL é asensitive. Tipos de cursor Passos para usar Cursor 1. Declare cursor 2. Open cursor 3. Loop 4. Fetch data from cursor 5. Exit loop 6. Close cursor DECLARE statement • Sintaxe DECLARE cursor_name CURSOR FOR SELECT_statement; • Explicação • A declaração do cursor deve estar após qualquer declaração de variável • Um cursor deve sempre ser associado a uma SELECT Instrução OPEN • Sintaxe OPEN cursor_name; • Explicação • A instrução OPEN inicializa o conjunto de resultados para o cursor, portanto, você deve chamar a instrução OPEN antes de buscar linhas do conjunto de resultados LOOP statement • Sintaxe [nome_rótulo :] LOOP lista_de_instruções END LOOP [nome_rótulo] • Explicação • O loop LOOP depende do posicionamento cuidadoso da instrução LEAVE para encerrar a iteração Declaração FETCH •Sintaxe FETCH cursor_name INTO variables list; • Explicação • Usamos a declaração FETCH para recuperar a próxima linha apontada pelo cursor e mover o cursor para a próxima linha no conjunto de resultados. Declaração CLOSE • Sintaxe CLOSE cursor_name; • Explicação • Finalmente, você chama a declaração CLOSE para desativar o cursor e liberar a memória associada a ele Handler NOT FOUND Ao trabalhar com o cursor MySQL, você também deve declarar um manipulador NOT FOUND para lidar com a situação quando o cursor não consegue encontrar nenhuma linha. Porque cada vez que você chama a instrução FETCH, o cursor tenta ler a próxima linha no conjunto de resultados. Quando o cursor atinge o final do conjunto de resultados, ele não consegue obter os dados, e uma condição é levantada. O manipulador é usado para lidar com essa condição NOT FOUND handler •Syntax DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE • Explicação Onde finished é uma variável para indicar que o cursor alcançou o fim do conjunto de resultados. Observe que a declaração do manipulador deve aparecer após a declaração da variável e do cursor dentro dos procedimentos armazenados. MySQL cursor working 22 Exemplo 23 Exemplo 24 Exemplo 25 Exemplo Dada a tabela a seguir faça um programa em SQL, que crie um cursor que leia os salários de todos os funcionários e mostre o total de salários acumulados Exercício