SlideShare uma empresa Scribd logo
1 de 74
Banco de Dados II Capítulo 1: SQL-PSM UFCG/DSC Bacharelado em Ciência da Computação Cláudio Baptista, Ph.D.
Ex.: Escreva um programa Pascal que leia a matricula de um empregado e imprima  as informações 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, endereço, função, 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.
Cursor ,[object Object],[object Object],[object Object]
Cursores ,[object Object],[object Object],[object Object],[object Object],[object Object]
Cursor ,[object Object],[object Object],[object Object],[object Object]
Cursor ,[object Object],[object Object],[object Object],[object Object],[object Object]
Cursor ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Um Exemplo 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”, titulo); }; EXEC SQL CLOSE filme_cursor; return; erro:  printf(“Um Erro ocorreu!”); };
Exemplo usando Delete e Update // Se empregado ganha mais de 10000 é demitido; senão tem seu  // salário 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 não há mais tuplas if (strcmp(SQLSTATE, “02000”)) break; if (salario > 10000) EXEC SQL DELETE FROM CLIENTE WHERE CURRENT OF salCursor; else  EXEC SQL  UPDATE CLIENTE SET salario = salario - salario * 0.2; WHERE CURRENT OF salCursor; } EXEC SQL CLOSE salCursor; }
Cursor ,[object Object],[object Object],[object Object],[object Object],[object Object]
Cursor ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Integração Estreita com SGBDs ,[object Object],[object Object],[object Object]
Stored Procedures ,[object Object],[object Object]
Stored Procedures ,[object Object],[object Object],[object Object],[object Object],[object Object]
Stored Procedures ,[object Object],[object Object],[object Object]
Stored Procedures - Vantagens ,[object Object]
Stored Procedures - Vantagens ,[object Object]
Stored Procedures: SQL/PSM ,[object Object],[object Object],[object Object]
Stored Procedures -SQL/PSM ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Stored Procedures -SQL/PSM Exemplo: CREATE PROCEDURE MudaEndereco ( IN endAntigo VARCHAR(255), IN endNovo VARCHAR(255) ) UPDATE  Empregado SET endereco = endNovo WHERE endereco = endAntigo;
Stored Procedures -SQL/PSM Alguns Comandos: 1) Chamada a um procedimento: CALL <nome procedure> (<lista argumentos>); Obs.: CALL é aplicado apenas a Procedures (não a Function) Esta chamada pode ser realizada de vários lugares: - Programa com SQL embutido EXEC SQL CALL calcula(:x, 3); - Como comando em outro procedimento ou função PSM: CALL calcula (10); 2) Comando de Retorno (usado apenas em funções) RETURN <expressão>; (OBS este comando não encerra a função)
Stored Procedures -SQL/PSM 3 )  Declaração de variáveis locais: DECLARE <nome> <tipo>; 4) Comando de atribuição SET <variável> = <expressão>; 5) Grupo de comandos: delimitados por BEGIN e END 6) Labels: colocamos labels em comandos precedendo estes pelo nome do label e dois pontos. 7) Comandos condicionais  8) Laços IF <condição> THEN   LOOP <comandos>   <Comandos> ELSEIF <condição> THEN END LOOP; <comandos> … ELSE <comandos> END IF;
Stored Procedures -SQL/PSM Exemplo: Função sobre o esquema Filmes que recebe um ano  e nome de estúdio e retorna TRUE se aquele estúdio produziu  apenas um  filme preto e branco naquele ano ou nada produziu. CREATE FUNCTION PretoeBranco( a int, studio char[15])  RETURNS BOOLEAN IF not exists ( select * from Filme where ano = a and   nomeStudio = studio) THEN RETURN TRUE; -- não faz a função retornar agora ELSEIF 1 <=  (select count(*) from Filme where ano = a and nomeStudio = nome and NOT emcores) THEN RETURN TRUE; ELSE RETURN FALSE; END IF;
Stored Procedures -SQL/PSM Exemplo: Procedimento que calcula a média e variância de um  estúdio CREATE PROCEDURE MeanVar ( IN s char[15],  OUT mean REAL, OUT variance REAL) DECLARE NotFound FOR SQLSTATE ‘02000’; DECLARE filmeCursor CURSOR FOR select duracao from Filme where nomeStudio = s; DECLARE novaDuracao INTEGER; DECLARE contaFilmes INTEGER; BEGIN SET mean = 0.0; SET variance = 0.0; SET contaFilmes = 0; OPEN filmeCursor; filmeLOOP: LOOP FETCH filmeCursor INTO novaDuracao; IF NotFound THEN LEAVE filmeCurdor END IF; SET contaFilmes = contaFilmes + 1; SET mean = mean + novaDuracao; SET variance = variance + novaDuracao * novaDuracao; END LOOP; SET mean = mean / contaFilmes; SET variance = variance/contaFilmes - mean * mean; CLOSE filmeCursor; END;
Stored Procedures -SQL/PSM -  For-Loops usado para fazer iterator num cursor FOR <nome laço> AS <nome cursor> CURSOR FOR <query> DO <comandos> END FOR; Veja exemplo no próximo slide! - WHILE <condição> DO <comandos> END WHILE; - REPEAT <comandos> UNTIL <condição> END REPEAT;
Stored Procedures -SQL/PSM Exemplo: Mesmo procedimento de média e variância de estúdios,  usando FOR-Loops CREATE PROCEDURE MeanVar ( IN s char[15],  OUT mean REAL, OUT variance REAL) DECLARE contaFilmes INTEGER; BEGIN SET mean = 0.0; SET variance = 0.0; SET contaFilmes = 0; FOR filmeLOOP AS filmeCursor CURSOR FOR   select duracao from Filme where nomeStudio = s; DO SET contaFilmes = contaFilmes + 1; SET mean = mean + novaDuracao; SET variance = variance + novaDuracao * novaDuracao; END FOR; SET mean = mean / contaFilmes; SET variance = variance/contaFilmes - mean * mean; END;  OBS.Veja que não é n ecessário OPEN, FETCH e CLOSE do cursor
Stored Procedures -SQL/PSM Exceções em PSM: É possível testar o SQLSTATE para verificar a ocorrência  de erros e tomar uma decisão, quando erros ocorram Isto é feito através do EXCEPTION HANDLER que é  associado a blocos BEGIN END (o handler aparece dentro do bloco) Os componentes do handler são: 1) Lista de exceções a serem tratadas 2) Código a ser executado quando exceção ocorrer 3) Indicação para onde ir depois que o handler concluir SINTAXE:  DECLARE <onde ir> HANDLER FOR <condições> <comando> As escolhas de <onde ir> são: - CONTINUE - EXIT (sai do bloco BEGIN .. END) - UNDO
Stored Procedures -SQL/PSM Exemplo de exceções em PSM: CREATE FUNCTION getSalario (mat integer) RETURNS FLOAT DECLARE NotFound CONDITION FOR SQLSTATE ‘02000’; DECLARE TooMany CONDITION FOR SQLSTATE ‘21000’; BEGIN DECLARE EXIT HANDLER FOR NotFound, TooMany RETURN NULL; RETURN ( select salario  from Empregado where  where matricula = mat); END;
PL-SQL : Oracle Stored Procedures ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Oracle Stored Procedures ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Blocos Anônimos ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
 
DECLARE Sintaxe Exemplos identifier  [CONSTANT]  datatype  [NOT NULL]  [:= | DEFAULT  expr ]; Declare   birthday DATE; age   NUMBER(2) NOT NULL := 27;   name   VARCHAR2(13) := 'Levi'; magic CONSTANT NUMBER := 77; valid BOOLEAN NOT NULL := TRUE; Note que PL/SQL inclui todos tipos SQL, e mais…
Declarando Variáveis com %TYPE  Exemplos DECLARE sname Sailors.sname%TYPE; fav_boat VARCHAR2(30); my_fav_boat fav_boat%TYPE := 'Pinta'; ... Acessando  coluna sname na tabela Sailors Acessando outra variável
Criando um PL/SQL Record Um  record  é um tipo de variável que podemos definir (como ‘struct’ em C ou ‘object’ em Java) DECLARE TYPE  sailor_record_type  IS RECORD (sname   VARCHAR2(10), sid  VARCHAR2(9), age NUMBER(3),   rating  NUMBER(3)); sailor_record sailor_record_type; ... BEGIN Sailor _ record.sname:= ‘ peter ’ ; Sailor _ record.age:=45; …
Procedures ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
PL-SQL : Oracle Stored Procedures ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Oracle: Exemplo ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Oracle: Invocando Procedures ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ORACLE PSM ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Oracle: Consultas em PL/SQL ,[object Object],[object Object]
Single-Row Select ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Cursores ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Criando um Cursor ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],sailorData é uma variável que pode receber uma tupla da tabela sailors
Exemplo DECLARE Pi constant NUMBER(8,7) := 3.1415926; area NUMBER(14,2); cursor  rad_cursor  is  select * from RAD_VALS; rad_value rad_cursor%ROWTYPE; BEGIN open rad_cursor ; fetch rad_cursor   into rad_val ; area:=pi*power(rad_val.radius,2); insert into AREAS values (rad_val.radius, area); close rad_cursor; END; / Rad_cursor fetch Rad_val Radius Area AREAS 3 28.27 RAD_VALS radius 3 6 8
Explicit Cursor Attributes Obtém informação de status sobre um cursor. Atributo   Tipo  Descrição %ISOPEN   Boolean  Retorna  TRUE is o cursor    is open. %NOTFOUND   Boolean  Retorna TRUE se o fetch mais    recente não retorna uma tupla %FOUND   Boolean  Retorna  TRUE se o fetch mais   recente retorna uma tupla    complemento de %NOTFOUND %ROWCOUNT   Number  Retorna o total de tuplas      recuperadas.
Exemplo ,[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Tipo ROWTYPE ,[object Object],[object Object],[object Object]
Declarando Variáveis com %ROWTYPE  Declare uma variável com o tipo de uma linha de uma tabela. E como acessar oa campos de reserves_record? reserves_record Reserves%ROWTYPE;  reserves_record.sid:=9;  Reserves_record.bid:=877;  Acessando tabela Reserves
Exemplo ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Definição de Function -  Podemos definir uma função: CREATE FUNCTION <func_name>(<param_list>) RETURN <return_type> AS ... No corpo da função, &quot;RETURN <expression>;&quot;  sai (retorna) da função e retorna o  valor da <expression>.  - Para descobrir quais procedures e functions você já criou: select object_type, object_name from user_objects where object_type = 'PROCEDURE' or object_type = 'FUNCTION';
Removendo Procedures/Functions Para remover uma stored procedure/function:  drop procedure <procedure_name>; drop function <function_name>;
Outras formas de Laços ,[object Object],[object Object],FOR contador IN [REVERSE] valorInicial .. valorFinal LOOP sequência de comandos END LOOP
Outras formas de Laços ,[object Object],Create procedure VerificaEstoque Declare codInicial Produto.codProduto%Type; codFinal CodInicial%Type; estoque Produto.estoque%Type; Begin select Min(CodProduto), Max(codProduto) into codInicial, codFinal from Produto for c in codInicial..codFinal loop select estoque into estoque from produto  where codProd = c and  estoque>0 Dbms_Output.Put_Line(‘O codigo ’|| c || ‘ tem em estoque’); end loop; End
Outras formas de Laços ,[object Object],Sintaxe: WHILE condição LOOP Comandos END LOOP;
Loops: WHILE Loop DECLARE TEN number:=10; i number_table.num%TYPE:=1; BEGIN WHILE  i <= TEN  LOOP INSERT INTO number_table  VALUES(i); i := i + 1; END LOOP; END;
Manipulando Exceções  ,[object Object],[object Object],[object Object],[object Object],[object Object]
Manipulando Exceções  Sintaxe: EXCEPTION WHEN nomeExceção 1 THEN Comandos WHEN nomeExceção2 THEN Comandos Exemplo begin insert into Pais values (100, ‘Brasil’); Commit; Dbms_Output.Put_Line(‘Inserção realizada com sucesso’); Exception when Dup_Val_On_Index Then   Dbms_Output.Put_Line(‘País já cadastrado!’); when Others then   Dbms_Output.Put_Line(‘Erro ao cadastrar país’); end;
Execeções Pré-definidas ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Exemplo de Exceção Declare  Aux_X number(1); Subtype TipoX is Aux_X%Type; -- Limitado entre -9 e 9 x TipoX; y TipoX; Begin x := 10; Exception  when value_error then   Dbms_Output.Put_Line(‘Valor fora  do limite’); End;
Exceção definida pelo Usuário Devem ser declaradas na área de declarações de um bloco ou  procedure/function ou package Comando: Declare  nomeExceção EXCEPTION; Begin Sequencia de comandos If … then RAISE nomeExceção; End If; Comandos Exception When NomeExceção then Comandos End
Exemplo: suponha a seguinte tabela: ,[object Object],create table mylog( who varchar2(30),  logon_num number ); mylog logon_num who 3 Peter 4 John 2 Moshe
Solução DECLARE cnt  NUMBER; BEGIN select count(*) into cnt from mylog where who = user; if cnt > 0 then update mylog set logon_num = logon_num + 1 where who = user; else  insert into mylog values(user, 1); end if; commit; end; /
Solução (2) BEGIN update mylog set logon_num = logon_num + 1 where who = user; if SQL%ROWCOUNT = 0 then insert into mylog values(user, 1); end if; commit; END; /
create or replace procedure  num_logged (person IN mylog.who%TYPE, num OUT mylog.logon_num%TYPE) IS BEGIN select logon_num  into num from mylog where who = person; END; / Exemplo- o que faz a SP abaixo? Table mylog logon_ num who 3 Pete 4 John 2 Joe
declare howmany  mylog.logon_num%TYPE; begin num_logged( ‘ John',howmany); dbms_output.put_line(howmany); end; / Chamando uma Procedure
Erros numa Procedure/Function ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
create or replace function  rating_message(rating IN NUMBER) return VARCHAR2 AS BEGIN IF rating > 7 THEN return 'You are great';  ELSIF rating >= 5 THEN  return  'Not bad'; ELSE return 'Pretty bad'; END IF; END; / Exemplo de Function NOTE que não especifica o tamanho
declare paulRate:=9; Begin dbms_output.put_line(ratingMessage(paulRate)); end; / Chamando uma function
Exemplos de SP em SQL Server
Java Stored Procedure no Oracle import java.sql.*; import java.io.*; import oracle.jdbc.*; public class BookDML { public static void insertBook (String title, String publisher) throws SQLException { String sql = “INSERT INTO Livros VALUES (?, ?)”; try { Connection con = DriverManager.getConnection(“jdbc:default:connection:”); PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, title); pstmt.setString(2, publisher); pstmt.close(); } catch (SQLException e) {system.err.println(e.getMessage()); } }
Java Stored Procedure no Oracle Carregando a Classe no Banco de dados: > loadjava –u baptista BookDML.java Acessando a classe: create or replace procedure InsertBookJava (title varchar(), publisher varchar) As Language java Name ‘BookDML.insertBook(java.lang.String, java.lang.String)’; Executando do SQLPlus: CALL  insertBookJava(´Meulivro´, ´LMV´);
 

Mais conteúdo relacionado

Mais procurados

0000364 aula 5 estruturas de decisão
0000364 aula 5   estruturas de decisão0000364 aula 5   estruturas de decisão
0000364 aula 5 estruturas de decisãoEvelyneBorges
 
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoLidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoRafael Ponte
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggersDaniel Maia
 
Desenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored ProcedureDesenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored ProcedureFernando Roberto Proença
 
apostila de sql - oracle
 apostila de sql - oracle  apostila de sql - oracle
apostila de sql - oracle Rosete Lima
 
Struts Cap10 DepuraçãO E Log
Struts Cap10 DepuraçãO E LogStruts Cap10 DepuraçãO E Log
Struts Cap10 DepuraçãO E LogWaldir R. Pires Jr
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL BásicoIgor Alves
 
Sebenta Ling Prog Cptig MóDulo Iii Carla
Sebenta Ling Prog Cptig   MóDulo Iii CarlaSebenta Ling Prog Cptig   MóDulo Iii Carla
Sebenta Ling Prog Cptig MóDulo Iii CarlaCarla Silva
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 

Mais procurados (19)

0000364 aula 5 estruturas de decisão
0000364 aula 5   estruturas de decisão0000364 aula 5   estruturas de decisão
0000364 aula 5 estruturas de decisão
 
Aula3
Aula3Aula3
Aula3
 
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto CriticoLidando com o Caos: Testando Código PLSQL em um Projeto Critico
Lidando com o Caos: Testando Código PLSQL em um Projeto Critico
 
Stored procedure
Stored procedureStored procedure
Stored procedure
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggers
 
Desenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored ProcedureDesenvolvimento de um CRUD utilizando Stored Procedure
Desenvolvimento de um CRUD utilizando Stored Procedure
 
Apostila de sql
Apostila de sqlApostila de sql
Apostila de sql
 
Comandos e expressões
Comandos e expressõesComandos e expressões
Comandos e expressões
 
apostila de sql - oracle
 apostila de sql - oracle  apostila de sql - oracle
apostila de sql - oracle
 
C# switch case
C#  switch caseC#  switch case
C# switch case
 
Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)Event-based Asynchronous Pattern (EAP)
Event-based Asynchronous Pattern (EAP)
 
Struts Cap10 DepuraçãO E Log
Struts Cap10 DepuraçãO E LogStruts Cap10 DepuraçãO E Log
Struts Cap10 DepuraçãO E Log
 
apostila-de-sql
apostila-de-sqlapostila-de-sql
apostila-de-sql
 
Apostila de sql
Apostila de sqlApostila de sql
Apostila de sql
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL Básico
 
Sebenta Ling Prog Cptig MóDulo Iii Carla
Sebenta Ling Prog Cptig   MóDulo Iii CarlaSebenta Ling Prog Cptig   MóDulo Iii Carla
Sebenta Ling Prog Cptig MóDulo Iii Carla
 
Apostila de sql oracle
Apostila de sql oracleApostila de sql oracle
Apostila de sql oracle
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
Pilhas
PilhasPilhas
Pilhas
 

Semelhante a Banco de Dados II Capítulo 1: SQL-PSM

Apostila de sql oracle (pt br)
Apostila de sql   oracle (pt br)Apostila de sql   oracle (pt br)
Apostila de sql oracle (pt br)Sandro Freitas
 
Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8Emiliano Barbosa
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Willian Magalhães
 
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A ObjetosSap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A ObjetosMarcelo Ramos
 
Treinamento Oracle Forms
Treinamento Oracle FormsTreinamento Oracle Forms
Treinamento Oracle FormsFelipe Goulart
 
3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics3º Fast Show - SQL Analytics
3º Fast Show - SQL Analyticsqualidatavix
 
Stored Procedures com PostgreSQL: porque usar.
Stored Procedures com PostgreSQL:  porque usar.Stored Procedures com PostgreSQL:  porque usar.
Stored Procedures com PostgreSQL: porque usar.Atmos Maciel
 
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...PGDay Campinas
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...iMasters
 
Net Coders Ladies SQL
Net Coders Ladies SQL Net Coders Ladies SQL
Net Coders Ladies SQL Aline Lavorato
 
Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)Mario Sergio
 
Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessRafael Farias Silva
 

Semelhante a Banco de Dados II Capítulo 1: SQL-PSM (20)

Stored procedure
Stored procedureStored procedure
Stored procedure
 
Curso de sql
Curso de sqlCurso de sql
Curso de sql
 
Apostila de sql oracle (pt br)
Apostila de sql   oracle (pt br)Apostila de sql   oracle (pt br)
Apostila de sql oracle (pt br)
 
Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Apostila de sql_-_oracle__pt_br_
Apostila de sql_-_oracle__pt_br_Apostila de sql_-_oracle__pt_br_
Apostila de sql_-_oracle__pt_br_
 
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A ObjetosSap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
Sap Inside Track Sao Paulo 09 Classes De Negócio Em Abap Orientado A Objetos
 
Treinamento Oracle Forms
Treinamento Oracle FormsTreinamento Oracle Forms
Treinamento Oracle Forms
 
3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics
 
Simulador Funcional
Simulador FuncionalSimulador Funcional
Simulador Funcional
 
Stored Procedures com PostgreSQL: porque usar.
Stored Procedures com PostgreSQL:  porque usar.Stored Procedures com PostgreSQL:  porque usar.
Stored Procedures com PostgreSQL: porque usar.
 
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
 
Java13
Java13Java13
Java13
 
Aula5
Aula5Aula5
Aula5
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
 
Net Coders Ladies SQL
Net Coders Ladies SQL Net Coders Ladies SQL
Net Coders Ladies SQL
 
Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)Introdução a Banco de Dados (Parte 3)
Introdução a Banco de Dados (Parte 3)
 
Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração Painless
 
Falando "Postgrês"
Falando "Postgrês"Falando "Postgrês"
Falando "Postgrês"
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 

Banco de Dados II Capítulo 1: SQL-PSM

  • 1. Banco de Dados II Capítulo 1: SQL-PSM UFCG/DSC Bacharelado em Ciência da Computação Cláudio Baptista, Ph.D.
  • 2. Ex.: Escreva um programa Pascal que leia a matricula de um empregado e imprima as informações 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, endereço, função, 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.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8. Um Exemplo 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”, titulo); }; EXEC SQL CLOSE filme_cursor; return; erro: printf(“Um Erro ocorreu!”); };
  • 9. Exemplo usando Delete e Update // Se empregado ganha mais de 10000 é demitido; senão tem seu // salário 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 não há mais tuplas if (strcmp(SQLSTATE, “02000”)) break; if (salario > 10000) EXEC SQL DELETE FROM CLIENTE WHERE CURRENT OF salCursor; else EXEC SQL UPDATE CLIENTE SET salario = salario - salario * 0.2; WHERE CURRENT OF salCursor; } EXEC SQL CLOSE salCursor; }
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20. Stored Procedures -SQL/PSM Exemplo: CREATE PROCEDURE MudaEndereco ( IN endAntigo VARCHAR(255), IN endNovo VARCHAR(255) ) UPDATE Empregado SET endereco = endNovo WHERE endereco = endAntigo;
  • 21. Stored Procedures -SQL/PSM Alguns Comandos: 1) Chamada a um procedimento: CALL <nome procedure> (<lista argumentos>); Obs.: CALL é aplicado apenas a Procedures (não a Function) Esta chamada pode ser realizada de vários lugares: - Programa com SQL embutido EXEC SQL CALL calcula(:x, 3); - Como comando em outro procedimento ou função PSM: CALL calcula (10); 2) Comando de Retorno (usado apenas em funções) RETURN <expressão>; (OBS este comando não encerra a função)
  • 22. Stored Procedures -SQL/PSM 3 ) Declaração de variáveis locais: DECLARE <nome> <tipo>; 4) Comando de atribuição SET <variável> = <expressão>; 5) Grupo de comandos: delimitados por BEGIN e END 6) Labels: colocamos labels em comandos precedendo estes pelo nome do label e dois pontos. 7) Comandos condicionais 8) Laços IF <condição> THEN LOOP <comandos> <Comandos> ELSEIF <condição> THEN END LOOP; <comandos> … ELSE <comandos> END IF;
  • 23. Stored Procedures -SQL/PSM Exemplo: Função sobre o esquema Filmes que recebe um ano e nome de estúdio e retorna TRUE se aquele estúdio produziu apenas um filme preto e branco naquele ano ou nada produziu. CREATE FUNCTION PretoeBranco( a int, studio char[15]) RETURNS BOOLEAN IF not exists ( select * from Filme where ano = a and nomeStudio = studio) THEN RETURN TRUE; -- não faz a função retornar agora ELSEIF 1 <= (select count(*) from Filme where ano = a and nomeStudio = nome and NOT emcores) THEN RETURN TRUE; ELSE RETURN FALSE; END IF;
  • 24. Stored Procedures -SQL/PSM Exemplo: Procedimento que calcula a média e variância de um estúdio CREATE PROCEDURE MeanVar ( IN s char[15], OUT mean REAL, OUT variance REAL) DECLARE NotFound FOR SQLSTATE ‘02000’; DECLARE filmeCursor CURSOR FOR select duracao from Filme where nomeStudio = s; DECLARE novaDuracao INTEGER; DECLARE contaFilmes INTEGER; BEGIN SET mean = 0.0; SET variance = 0.0; SET contaFilmes = 0; OPEN filmeCursor; filmeLOOP: LOOP FETCH filmeCursor INTO novaDuracao; IF NotFound THEN LEAVE filmeCurdor END IF; SET contaFilmes = contaFilmes + 1; SET mean = mean + novaDuracao; SET variance = variance + novaDuracao * novaDuracao; END LOOP; SET mean = mean / contaFilmes; SET variance = variance/contaFilmes - mean * mean; CLOSE filmeCursor; END;
  • 25. Stored Procedures -SQL/PSM - For-Loops usado para fazer iterator num cursor FOR <nome laço> AS <nome cursor> CURSOR FOR <query> DO <comandos> END FOR; Veja exemplo no próximo slide! - WHILE <condição> DO <comandos> END WHILE; - REPEAT <comandos> UNTIL <condição> END REPEAT;
  • 26. Stored Procedures -SQL/PSM Exemplo: Mesmo procedimento de média e variância de estúdios, usando FOR-Loops CREATE PROCEDURE MeanVar ( IN s char[15], OUT mean REAL, OUT variance REAL) DECLARE contaFilmes INTEGER; BEGIN SET mean = 0.0; SET variance = 0.0; SET contaFilmes = 0; FOR filmeLOOP AS filmeCursor CURSOR FOR select duracao from Filme where nomeStudio = s; DO SET contaFilmes = contaFilmes + 1; SET mean = mean + novaDuracao; SET variance = variance + novaDuracao * novaDuracao; END FOR; SET mean = mean / contaFilmes; SET variance = variance/contaFilmes - mean * mean; END; OBS.Veja que não é n ecessário OPEN, FETCH e CLOSE do cursor
  • 27. Stored Procedures -SQL/PSM Exceções em PSM: É possível testar o SQLSTATE para verificar a ocorrência de erros e tomar uma decisão, quando erros ocorram Isto é feito através do EXCEPTION HANDLER que é associado a blocos BEGIN END (o handler aparece dentro do bloco) Os componentes do handler são: 1) Lista de exceções a serem tratadas 2) Código a ser executado quando exceção ocorrer 3) Indicação para onde ir depois que o handler concluir SINTAXE: DECLARE <onde ir> HANDLER FOR <condições> <comando> As escolhas de <onde ir> são: - CONTINUE - EXIT (sai do bloco BEGIN .. END) - UNDO
  • 28. Stored Procedures -SQL/PSM Exemplo de exceções em PSM: CREATE FUNCTION getSalario (mat integer) RETURNS FLOAT DECLARE NotFound CONDITION FOR SQLSTATE ‘02000’; DECLARE TooMany CONDITION FOR SQLSTATE ‘21000’; BEGIN DECLARE EXIT HANDLER FOR NotFound, TooMany RETURN NULL; RETURN ( select salario from Empregado where where matricula = mat); END;
  • 29.
  • 30.
  • 31.
  • 32.  
  • 33. DECLARE Sintaxe Exemplos identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr ]; Declare birthday DATE; age NUMBER(2) NOT NULL := 27; name VARCHAR2(13) := 'Levi'; magic CONSTANT NUMBER := 77; valid BOOLEAN NOT NULL := TRUE; Note que PL/SQL inclui todos tipos SQL, e mais…
  • 34. Declarando Variáveis com %TYPE Exemplos DECLARE sname Sailors.sname%TYPE; fav_boat VARCHAR2(30); my_fav_boat fav_boat%TYPE := 'Pinta'; ... Acessando coluna sname na tabela Sailors Acessando outra variável
  • 35. Criando um PL/SQL Record Um record é um tipo de variável que podemos definir (como ‘struct’ em C ou ‘object’ em Java) DECLARE TYPE sailor_record_type IS RECORD (sname VARCHAR2(10), sid VARCHAR2(9), age NUMBER(3), rating NUMBER(3)); sailor_record sailor_record_type; ... BEGIN Sailor _ record.sname:= ‘ peter ’ ; Sailor _ record.age:=45; …
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45. Exemplo DECLARE Pi constant NUMBER(8,7) := 3.1415926; area NUMBER(14,2); cursor rad_cursor is select * from RAD_VALS; rad_value rad_cursor%ROWTYPE; BEGIN open rad_cursor ; fetch rad_cursor into rad_val ; area:=pi*power(rad_val.radius,2); insert into AREAS values (rad_val.radius, area); close rad_cursor; END; / Rad_cursor fetch Rad_val Radius Area AREAS 3 28.27 RAD_VALS radius 3 6 8
  • 46. Explicit Cursor Attributes Obtém informação de status sobre um cursor. Atributo Tipo Descrição %ISOPEN Boolean Retorna TRUE is o cursor is open. %NOTFOUND Boolean Retorna TRUE se o fetch mais recente não retorna uma tupla %FOUND Boolean Retorna TRUE se o fetch mais recente retorna uma tupla complemento de %NOTFOUND %ROWCOUNT Number Retorna o total de tuplas recuperadas.
  • 47.
  • 48.
  • 49.
  • 50. Declarando Variáveis com %ROWTYPE Declare uma variável com o tipo de uma linha de uma tabela. E como acessar oa campos de reserves_record? reserves_record Reserves%ROWTYPE; reserves_record.sid:=9; Reserves_record.bid:=877; Acessando tabela Reserves
  • 51.
  • 52. Definição de Function - Podemos definir uma função: CREATE FUNCTION <func_name>(<param_list>) RETURN <return_type> AS ... No corpo da função, &quot;RETURN <expression>;&quot; sai (retorna) da função e retorna o valor da <expression>. - Para descobrir quais procedures e functions você já criou: select object_type, object_name from user_objects where object_type = 'PROCEDURE' or object_type = 'FUNCTION';
  • 53. Removendo Procedures/Functions Para remover uma stored procedure/function: drop procedure <procedure_name>; drop function <function_name>;
  • 54.
  • 55.
  • 56.
  • 57. Loops: WHILE Loop DECLARE TEN number:=10; i number_table.num%TYPE:=1; BEGIN WHILE i <= TEN LOOP INSERT INTO number_table VALUES(i); i := i + 1; END LOOP; END;
  • 58.
  • 59. Manipulando Exceções Sintaxe: EXCEPTION WHEN nomeExceção 1 THEN Comandos WHEN nomeExceção2 THEN Comandos Exemplo begin insert into Pais values (100, ‘Brasil’); Commit; Dbms_Output.Put_Line(‘Inserção realizada com sucesso’); Exception when Dup_Val_On_Index Then Dbms_Output.Put_Line(‘País já cadastrado!’); when Others then Dbms_Output.Put_Line(‘Erro ao cadastrar país’); end;
  • 60.
  • 61. Exemplo de Exceção Declare Aux_X number(1); Subtype TipoX is Aux_X%Type; -- Limitado entre -9 e 9 x TipoX; y TipoX; Begin x := 10; Exception when value_error then Dbms_Output.Put_Line(‘Valor fora do limite’); End;
  • 62. Exceção definida pelo Usuário Devem ser declaradas na área de declarações de um bloco ou procedure/function ou package Comando: Declare nomeExceção EXCEPTION; Begin Sequencia de comandos If … then RAISE nomeExceção; End If; Comandos Exception When NomeExceção then Comandos End
  • 63.
  • 64. Solução DECLARE cnt NUMBER; BEGIN select count(*) into cnt from mylog where who = user; if cnt > 0 then update mylog set logon_num = logon_num + 1 where who = user; else insert into mylog values(user, 1); end if; commit; end; /
  • 65. Solução (2) BEGIN update mylog set logon_num = logon_num + 1 where who = user; if SQL%ROWCOUNT = 0 then insert into mylog values(user, 1); end if; commit; END; /
  • 66. create or replace procedure num_logged (person IN mylog.who%TYPE, num OUT mylog.logon_num%TYPE) IS BEGIN select logon_num into num from mylog where who = person; END; / Exemplo- o que faz a SP abaixo? Table mylog logon_ num who 3 Pete 4 John 2 Joe
  • 67. declare howmany mylog.logon_num%TYPE; begin num_logged( ‘ John',howmany); dbms_output.put_line(howmany); end; / Chamando uma Procedure
  • 68.
  • 69. create or replace function rating_message(rating IN NUMBER) return VARCHAR2 AS BEGIN IF rating > 7 THEN return 'You are great'; ELSIF rating >= 5 THEN return 'Not bad'; ELSE return 'Pretty bad'; END IF; END; / Exemplo de Function NOTE que não especifica o tamanho
  • 70. declare paulRate:=9; Begin dbms_output.put_line(ratingMessage(paulRate)); end; / Chamando uma function
  • 71. Exemplos de SP em SQL Server
  • 72. Java Stored Procedure no Oracle import java.sql.*; import java.io.*; import oracle.jdbc.*; public class BookDML { public static void insertBook (String title, String publisher) throws SQLException { String sql = “INSERT INTO Livros VALUES (?, ?)”; try { Connection con = DriverManager.getConnection(“jdbc:default:connection:”); PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, title); pstmt.setString(2, publisher); pstmt.close(); } catch (SQLException e) {system.err.println(e.getMessage()); } }
  • 73. Java Stored Procedure no Oracle Carregando a Classe no Banco de dados: > loadjava –u baptista BookDML.java Acessando a classe: create or replace procedure InsertBookJava (title varchar(), publisher varchar) As Language java Name ‘BookDML.insertBook(java.lang.String, java.lang.String)’; Executando do SQLPlus: CALL insertBookJava(´Meulivro´, ´LMV´);
  • 74.