Cap­tulo 1: SQL-PSM (Persistent Stored Modules) Banco de Dados II Prof. Carlos Eduardo Pires cesp@dsc.ufcg.edu.br

  • View
    107

  • Download
    1

Embed Size (px)

Text of Cap­tulo 1: SQL-PSM (Persistent Stored Modules) Banco de Dados II Prof. Carlos Eduardo Pires...

  • Slide 1
  • Captulo 1: SQL-PSM (Persistent Stored Modules) Banco de Dados II Prof. Carlos Eduardo Pires cesp@dsc.ufcg.edu.br
  • Slide 2
  • Captulo 1: SQL-PSM2 Motivao Ex.: Escreva um programa Pascal que leia a matricula de um empregado e imprima as informaes sobre este empregado. program Imprima; var loop: char; matricula: integer; E: record of nome: string[15]; endereco: string[30]; funcao: string[10]; salario: real; end; begin loop := S; while (loop = S) do begin writeln(Entre com a matricula:); readln(matricula); $ select nome, endereo, funo, salario into :E.nome, E.endereco, :E.funcao, :E.salario where matricula = :matricula; writeln(E.nome, :E.endereco, E.funcao, E.salario); writeln(Deseja ler mais empregados(S/N)?); readln(loop); end; end. Uma consulta executada a cada iterao: E o desempenho?
  • Slide 3
  • Captulo 1: SQL-PSM3 Cursor No programa anterior uma nica tupla (ou linha) selecionada pelo SQL embutido Em geral, uma consulta resulta em vrias tuplas Problema SQL processa um conjunto de tuplas, enquanto que C e Pascal (ou outra linguagem host) processam uma tupla por vez Soluo Introduziu-se o conceito de cursor para permitir processar uma tupla por vez nas linguagens hospedeiras
  • Slide 4
  • Captulo 1: SQL-PSM4 Cursor Problema: Impedance Mismatch SQL trabalha com relaes Linguagens de programao trabalham de forma orientada a registro Como fazer para ler os dados de um conjunto retornado pelo SQL em uma linguagem de programao? Precisamos ter um mecanismos para associar os valores retornados pelo SGBD em variveis da aplicao Faz-se isso usando variveis hospedeiras
  • Slide 5
  • Captulo 1: SQL-PSM5 Cursor Ponteiro para uma nica tupla do resultado da consulta (result set) Cada cursor possui uma consulta associada, especificada como parte da operao que define o cursor A consulta executada quando o cursor for aberto Em uma mesma transao, um cursor pode ser aberto ou fechado qualquer nmero de vezes Pode-se ter vrios cursores abertos ao mesmo tempo
  • Slide 6
  • Captulo 1: SQL-PSM6 Cursor Sintaxe para especificao de um cursor EXEC SQL DECLARE nome-cursor CURSOR FOR clusula-select Um cursor possui as seguintes operaes: OPEN Executa a consulta especificada e pe o cursor para apontar para uma posio anterior primeira tupla do resultado da consulta FETCH Move o cursor para apontar para prxima linha no resultado da consulta, tornando-a a tupla corrente e copiando todos os valores dos atributos para as variveis da linguagem hospedeira usada CLOSE Fecha o cursor
  • Slide 7
  • Captulo 1: SQL-PSM7 OPEN FETCH CLOSE SELECT ename FROM employee Banco de Dados KING SMITH JOHN... Cursor KING SMITH JOHN... Cursor KING SMITH JOHN... Cursor
  • Slide 8
  • Captulo 1: SQL-PSM8 Cursor UPDATE CURRENT OF: realiza a atualizao dos atributos da tupla que est sendo apontada pelo cursor (linha corrente). Sintaxe: UPDATE tabela SET lista de atribuies WHERE CURRENT OF cursor DELETE... CURRENT OF: elimina a tupla que est sendo apontada pelo cursor (linha corrente). Sintaxe: DELETE FROM tabela WHERE CURRENT OF cursor
  • Slide 9
  • Captulo 1: SQL-PSM9 Um Exemplo de Uso de Cursor em C EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; char titulo[101]; char ano[5]; EXEC SQL DECLARE filme_cursor CURSOR FOR SELECT titulo FROM filmes WHERE ano = :ano; void main () { EXEC SQL WHENEVER SQLERROR GOTO erro; strcpy(ano,1998); EXEC SQL OPEN filme_cursor; while (strcmp(SQLSTATE, 02000) != 0) { EXEC SQL FETCH filme_cursor INTO :titulo; printf(%s\n, titulo); }; EXEC SQL CLOSE filme_cursor; return; erro: printf(Um Erro ocorreu!\n); };
  • Slide 10
  • Captulo 1: SQL-PSM10 Exemplo Usando DELETE e UPDATE // Se empregado ganha mais de 10000 demitido; seno tem seu // salrio reduzido em 20% void reducaodeFolhadePagamento() { EXEC SQL BEGIN DECLARE SECTION; char SQLSTATE[6]; float salario; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE salCursor CURSOR FOR SELECT salario FROM Empregado ; EXEC SQL OPEN salCursor; while(1) { EXEC SQL FETCH FROM salCursor INTO :salario; // Verifica se no h mais tuplas if (strcmp(SQLSTATE, 02000)) break; if (salario > 10000) EXEC SQL DELETE FROM Empregado WHERE CURRENT OF salCursor; else EXEC SQL UPDATE Empregado SET salario = salario - salario * 0.2; WHERE CURRENT OF salCursor; }EXEC SQL CLOSE salCursor; }
  • Slide 11
  • Captulo 1: SQL-PSM11 Scrolling Cursors Por default, cursores movem-se do incio do result set para frente (forward) Podemos mov-los tambm para trs e/ou para qualquer posio no result set Devemos acrescentar SCROLL na definio do cursor Exemplo EXEC DECLARE meuCursor SCROLL CURSOR FOR Empregado;
  • Slide 12
  • Captulo 1: SQL-PSM12 Scrolling Cursors Num FETCH, podemos adicionar as seguintes opes: NEXT ou PRIOR: pega o prximo ou anterior FIRST ou LAST: obtm o primeiro ou ltimo RELATIVE seguido de um inteiro: indica quantas tuplas mover para frente (se positivo) ou para trs (se negativo) ABSOLUTE seguido de um inteiro: indica a posio da tupla contando do incio (se positivo) ou do final (se negativo)
  • Slide 13
  • Captulo 1: SQL-PSM13 Exerccio de Sala Sem usar a sintaxe de uma linguagem de programao (ou seja, usando o bom e velho portugus) escrever um cdigo fictcio para recuperar e imprimir o nome dos alunos matriculados na turma de BD2, perodo 2010.2
  • Slide 14
  • Captulo 1: SQL-PSM14 Motivao Vimos anteriormente que cdigo SQL pode ser misturado com o cdigo de uma linguagem de programao Porm, perfeitamente possvel separar Cdigo da LP na aplicao Cdigo SQL no BD, nesse caso precisamos dar um nome ao cdigo SQL O cdigo da LP faz chamadas ao cdigo SQL atravs desses nomes
  • Slide 15
  • Captulo 1: SQL-PSM15 Integrao Estreita com SGBDs O uso de SQL/PSM (Stored Procedures) como PL/SQL, SQLJ, TransactSQL,, so extenses de SQL Processadas no lado servidor da arquitetura cliente- servidor: muito bom para o desempenho
  • Slide 16
  • Captulo 1: SQL-PSM16 Stored Procedures (SP) Em portugus, procedimentos armazenados Conjuntos de comandos SQL definidos pelo usurio que ficam armazenados num BD como um procedimento/funo para eventuais processamentos So processamentos de tarefas da aplicao que residem no SGBD ao invs de no cdigo da aplicao (cliente)
  • Slide 17
  • Captulo 1: SQL-PSM17 Vantagens das Stored Procedures Desempenho Ex.: Seja a consulta SELECT codigop, nome FROM Projeto p, Alocacao a WHERE p.codproj = a.codigop Se vrios usurios realizarem esta consulta o trfego de rede (dados e texto SQL) ser alto Se criarmos uma SP para executar a consulta, os usurios necessitaro apenas de um comando para executar a consulta anterior: EXEC nomeProcedimento; A consulta anterior seria compilada a cada chamada, enquanto o SP contendo a consulta seria compilado uma nica vez
  • Slide 18
  • Captulo 1: SQL-PSM18 Vantagens das Stored Procedures Manuteno Facilita o gerenciamento do BD, pois a consulta escrita em um nico lugar A manuteno torna-se mais eficaz e segura Segurana Podemos usar SPs para limitar o acesso de alguns usurios ao BD A maneira em que o BD pode ser modificado estritamente definida
  • Slide 19
  • Captulo 1: SQL-PSM19 Stored Procedures: SQL/PSM SQL/PSM (Persistent Stored Modules) Parte do padro SQL relativo s Stored Procedures Cada SGBD oferece sua prpria linguagem (PL/SQL, Transact/SQL, PL/pgSQL, etc.) Em PSM, definimos mdulos que so colees de definies de funes ou procedimentos, declaraes de tabelas temporrias, dentre outros
  • Slide 20
  • Captulo 1: SQL-PSM20 Stored Procedures: SQL/PSM Criando Funes e Procedimentos CREATE PROCEDURE ( ) declaraes locais corpo do procedimento; CREATE FUNCTION ( ) RETURNS declaraes locais corpo da funo; obs.: parmetros so do tipo modo-nome-tipo, onde modo indica IN, OUT ou INOUT Parmetros em funes devem ter modo IN
  • Slide 21
  • Captulo 1: SQL-PSM21 Stored Procedures: SQL/PSM Exemplo CREATE PROCEDURE MudaEndereco ( IN endAntigo VARCHAR(255), IN endNovo VARCHAR(255) ) UPDATE Empregado SET endereco = endNovo WHERE endereco = endAntigo;
  • Slide 22
  • Captulo 1: SQL-PSM22 Stored Procedures: SQL/PSM Alguns comandos 1) Chamada a um procedimento: CALL ( ); Obs.: CALL aplicado apenas a Procedures (no a Function) Esta chamada pode ser realizada de vrios lugares: Programa com SQL embutido EXEC SQL CALL calcula(:x, 3); Como comando em outro procedimento ou funo PSM: CALL calcula (10); 2) Comando de Retorno (usado apenas em funes) RETURN ; Obs.: este comando no encerra a funo
  • Slide 23
  • Captulo 1: SQL-PSM23 Stored Procedures: SQL/PSM 3) Declarao de variveis locais: DECLARE ; 4) Comando de atribuio SET = ; 5) Grupo de comandos: delimitados por BEGIN e END 6) Label Colocamos labels em comandos precedendo estes pelo nome do label e dois pontos
  • Slide 24
  • Captulo 1: SQL-PSM24 Stored Procedures: SQL/PSM 7) Comandos condicionais IF THEN ELSEIF THEN ELSE END IF; 8) Laos LOOP END;
  • Slide 25
  • Captulo 1: SQL-PSM25 Stored Procedures: SQL/PSM Exemplo: funo que recebe um ano e nome de estdio e retorna TRUE se no produziu nenhum filme naquele ano ou se aquele estdio produziu apenas um filme preto e branco CREATE FUNCTION PretoeBranco (p_ano int, studio char[15]) RETURNS BOOLEAN IF NOT EXISTS (SELECT * FROM Filme WHERE ano = p_ano AND nomeStudio = studio) THEN RETURN TRUE; ELSEIF 1 = (SELECT COUNT(*) FROM Filme WHERE ano = p_ano AND nomeStudio = studio AND NOT emcores) THEN RETURN TRUE; ELSE RETU