jahundredsound

432 visualizações

Publicada em

noisjahundredfilho

Publicada em: Educação
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

jahundredsound

  1. 1. Universidade Presbiteriana Mackenzie 1 Banco de Dados – Aula 02 Linguagem SQL SELECT com várias tabelas (inner join, left join e right join) Prof. Jamilson Bispo dos Santos
  2. 2. 2 Introdução Considere o seguinte Banco de Dados para esta aula:  Departamento = {Cod_Depto, Nome_Depto}  Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} - Cod_depto é chave estrangeira que referencia o atributo Cod_depto da tabela Departamento  Projeto = {Cod_Proj, Nome_Proj, Duracao}  Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} - Cod_Func é chave estrangeira que referencia o atributo Cod_Func da tabela Funcionario - Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj da tabela Projeto
  3. 3. 3 SELECT
  4. 4. 4 Introdução  A junção de várias tabelas pode ser feita na cláusula WHERE, colocando-se os nomes de todas as tabelas envolvidas na cláusula FROM
  5. 5. 5 Introdução  Exemplo (junção na cláusula WHERE): Obtenha o nome de cada funcionário e o nome do departamento que cada um pertence. SELECT F.Nome_Func, D.Nome_Depto FROM Funcionario F, Departamento D WHERE (F.Cod_depto = D.Cod_depto); Nome_Func Nome_Depto Joao da Silva Vendas Marcio Santana Pesquisa Maria Castro Marketing Mario Souza Marketing Sergio Santos Vendas
  6. 6. 6 INNER JOIN
  7. 7. 7 INNER JOIN  No padrão SQL:2003, a operação de junção de várias tabelas pode ser expressa diretamente na cláusula FROM, em vez de ser expressa nas cláusulas FROM e WHERE
  8. 8. 8 INNER JOIN  Para executar uma operação de junção na cláusula FROM, utilize as palavras-chave INNER JOIN e as condições de junção são indicadas pela palavra-chave ON, dentro da cláusula FROM (observe que a condição de junção não aparece mais na cláusula WHERE).
  9. 9. 9 INNER JOIN  Exemplo (INNER JOIN): Obtenha o nome de cada funcionário e o nome do departamento que cada um pertence SELECT F.Nome_Func, D.Nome_Depto FROM Funcionario F INNER JOIN Departamento D ON F.Cod_depto = D.Cod_depto; Nome_Func Nome_Depto Joao da Silva Vendas Marcio Santana Pesquisa Maria Castro Marketing Mario Souza Marketing Sergio Santos Vendas
  10. 10. 10 JUNÇÃO EXTERNA
  11. 11. 11 Junção Externa  Uma junção entre duas tabelas gera um resultado onde tem-se linhas que se combinam sobre a coluna de junção  O operador de junção externa gera o resultado da junção (as linhas combinadas) mais as linhas não combinadas
  12. 12. 12 Junção Externa  Uma junção externa de um lado gera um resultado com as linhas combinadas mais as linhas não combinadas com base em uma das tabelas  A linguagem SQL utiliza as palavras-chave LEFT JOIN e RIGHT JOIN para produzir a junção externa de um lado
  13. 13. 13 JUNÇÃO EXTERNA LEFT JOIN
  14. 14. Junção Externa – LEFT JOIN 14  A palavra-chave LEFT JOIN gera um resultado contendo as linhas combinadas e as linhas não combinadas da tabela da esquerda
  15. 15. Junção Externa – LEFT JOIN  Exemplo (LEFT JOIN): Obtenha os nomes de todos os departamentos da empresa, com os nomes dos funcionários que trabalham em cada um. 15 SELECT D.Nome_Depto, F.Nome_func FROM Departamento D LEFT JOIN Funcionario F ON D.Cod_depto = F.Cod_depto ORDER BY D.Nome_Depto; Nome_Depto Nome_func Dados Vendas Joao da Silva Pesquisa Marcio Santana Marketing Maria Castro Marketing Mario Souza Vendas Sergio Santos
  16. 16. Junção Externa – LEFT JOIN  Exemplo (LEFT JOIN): Obtenha os nomes de todos os departamentos da empresa, com os nomes dos funcionários que trabalham em cada um. 16 SELECT D.Nome_Depto, F.Nome_func FROM Departamento D LEFT JOIN Funcionario F ON D.Cod_depto = F.Cod_depto ORDER BY D.Nome_Depto; Nome_Depto Nome_func Dados Vendas Joao da Silva Pesquisa Marcio Santana Marketing Maria Castro Marketing Mario Souza Vendas Sergio Santos Observe que o departamento “Dados” não tem funcionário, mas apareceu no resultado
  17. 17. 17 JUNÇÃO EXTERNA RIGHT JOIN
  18. 18. Junção Externa – RIGHT JOIN 18  A palavra-chave RIGHT JOIN gera um resultado contendo as linhas combinadas e as linhas não combinadas da tabela da direita  Assim, o resultado de uma junção externa de um lado depende da direção (DIREITA ou ESQUERDA) e da posição dos nomes das tabelas
  19. 19. Junção Externa – RIGHT JOIN  Exemplo (RIGHT JOIN): Obtenha os nomes de todos os departamentos da empresa, com os nomes dos funcionários que trabalham em cada um. 19 SELECT D.Nome_Depto, F.Nome_func FROM Funcionario F RIGHT JOIN Departamento D ON D.Cod_depto = F.Cod_depto ORDER BY D.Nome_Depto; Nome_Depto Nome_func Dados Vendas Joao da Silva Pesquisa Marcio Santana Marketing Maria Castro Marketing Mario Souza Vendas Sergio Santos
  20. 20. Junção Externa – RIGHT JOIN  Observe que os exemplos anteriores, utilizando LEFT JOIN e RIGHT JOIN, trazem o mesmo resultado, com alterações apenas na ordem em que as tabelas aparecem na cláusula FROM. 20
  21. 21. Exemplos de LEFT JOIN e RIGHT JOIN  Exemplo: Obtenha os nomes de todos os departamentos da empresa e a quantidade de funcionários pertencentes a cada um deles (retorne mesmo aqueles departamentos onde não têm funcionários)  Observe os exemplos a seguir utilizando LEFT JOIN e RIGHT JOIN 21
  22. 22. Exemplos de LEFT JOIN e RIGHT JOIN 22  LEFT JOIN SELECT D.Nome_Depto, COUNT(F.Cod_func) AS Total_Empregados FROM Departamento D LEFT JOIN Funcionario F ON D.Cod_depto = F.Cod_depto GROUP BY D.Nome_Depto; Nome_Depto Total_Empregados Dados 0 Marketing 2 Pesquisa 1 Vendas 2
  23. 23. Exemplos de LEFT JOIN e RIGHT JOIN 23  RIGHT JOIN SELECT D.Nome_Depto, COUNT(F.Cod_func) AS Total_Empregados FROM Funcionario F RIGHT JOIN Departamento D ON D.Cod_depto = F.Cod_depto GROUP BY D.Nome_Depto; Nome_Depto Total_Empregados Dados 0 Marketing 2 Pesquisa 1 Vendas 2
  24. 24. Universidade Presbiteriana Mackenzie 24 FIM !!! J Banco de Dados – Aula 10 Linguagem SQL SELECT com várias tabelas (inner join, left join e right join) Texto Original da Profa. Elisângela Botelho Gracias
  25. 25. Universidade Presbiteriana Mackenzie 1 Banco de Dados – Aula 03 Linguagem SQL (Structured Query Language) Comando SELECT com Sub-Select Prof. Jamilson Bispo dos Santos
  26. 26. Banco de Dados Exemplo 2
  27. 27. Exemplo de Banco de Dados 3 Considere o seguinte modelo relacional : PECA = {PeNro, PeNome, PePreco, PeCor} FORNECEDOR = {FNro, FNome, FCidade, FCateg} PROJETO = {PNro, PNome, PDuracao, PCusto} FORNECE_PARA = {PeNro, FNro, PNro, Quant} - PeNro é chave estrangeira que referencia a tabela Peca - FNro é chave estrangeira que referencia a tabela Fornecedor - PNro é chave estrangeira que referencia a tabela Projeto
  28. 28. 4
  29. 29. 5 SELECT  Exemplo1 (sub-select): Obtenha o nome das peças utilizadas no projeto P5. PeNome SELECT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT Fornece_para.PeNro Limpador FROM Fornece_para WHERE Fornece_para.PNro = ‘P5’);
  30. 30. 6 SELECT  Exemplo2 (sub-select): Obtenha o nome das peças cujo preco é superior ao preço médio das peças. PPreco SELECT Peca.PeNome Cinto FROM Peca Painel WHERE Peca.PePreco > (SELECT AVG(Peca.PePreco) FROM Peca);
  31. 31. 7 SELECT  Exemplo3 (sub-select): Obtenha, sem repetição e em ordem crescente, o nome dos fornecedores que forneceram peças para algum projeto. SELECT DISTINCT Fornecedor.FNome FROM Fornecedor WHERE Fornecedor.FNro IN (SELECT Fornece_para.FNro FROM Fornece_para) ORDER BY Fornecedor.FNome ASC; FNome CM Equipament Kirurgic Piloto Plastec
  32. 32. 8 SELECT Exemplo4 (sub-select): Obtenha os nomes das peças utilizadas nos projetos com duração maior que 3 meses. SELECT DISTINCT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT Fornece_para.PeNro FROM Fornece_para WHERE Fornece_para.PNro IN PeNome Painel (SELECT Projeto.PNro FROM Projeto WHERE Projeto.PDuracao >3));
  33. 33. 9 SELECT  Exemplo5 (sub-select): Obtenha os nomes das peças fornecidas por algum fornecedor de Piracicaba. SELECT DISTINCT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT PeNro FROM Fornece_para WHERE FNro IN PeNome Limpador (SELECT FNro FROM Fornecedor WHERE FCidade = ‘Piracicaba’));
  34. 34. 10 SELECT  Exemplo6 (sub-select): Obtenha os nomes das peças que não são fornecidas por fornecedores da categoria A. SELECT DISTINCT Peca.PeNome FROM Peca WHERE Peca.PeNro IN (SELECT PeNro FROM Fornece_para WHERE FNro NOT IN PeNome Cinto Volante Painel (SELECT FNro FROM Fornecedor WHERE FCategoria = ‘A’));
  35. 35. PNome Total Sea 7 11 SELECT  Exemplo7 (sub-select): Obtenha o nome de cada projeto e o total de peças utilizadas em cada um, mas desde que esse total seja maior que o total de peças utilizadas no projeto ‘Paraiso’. SELECT P.PNome, SUM(FP.Quant) AS Total FROM Fornece_para FP, Projeto P WHERE (FP.PNro = P.PNro) GROUP BY P.PNome HAVING SUM(FP.Quant) > (SELECT SUM(FP.Quant) FROM Fornece_para FP, Projeto P WHERE (P.PNome = ‘Paraiso’) AND (FP.PNro = P.PNro));
  36. 36. 12 SELECT  Exemplo8 (UPDATE com sub-select): Atualize para 10 a quantidade da peça “Volante” fornecida pelo fornecedor F2 para o projeto P2. UPDATE Fornece_para SET Quant = 10 WHERE (FNro = ‘F2’) AND (PNro = ‘P2’) AND PeNro IN (SELECT PeNro FROM Peca WHERE (PeNome = ‘Volante’));
  37. 37. Universidade Presbiteriana Mackenzie 13 FIM !!! J Banco de Dados – Aula 09 Linguagem SQL (Structured Query Language) Comando SELECT com Sub-Select Texto original da Profa. Elisângela Botelho Gracias
  38. 38. Universidade Presbiteriana Mackenzie 1 Banco de Dados – Aula 01 Linguagem SQL - Operadores Prof. Jamilson Bispo dos Santos
  39. 39. 2 OPERADORES  Você pode combinar várias consultas usando o conjunto de operadores UNION, UNION ALL, INTERSECT e MINUS. Todos os operadores de conjunto têm a mesma precedência. Se uma instrução SQL contém vários operadores de conjunto, a SGBD geralmente avalia da esquerda para a direita se não houver parênteses especificar explicitamente outra ordem.
  40. 40. 3 UNION  O operador UNION retorna somente linhas distintas que aparecem em qualquer resultado, enquanto o operador UNION ALL retorna todas as linhas. O operador UNION ALL não elimina duplicados linhas selecionadas:
  41. 41. 4 UNION Exemplo: select id_empregado, nome_empregado from empregado_mensalista union all select id_empregado, nome_empregado from empregado_horista
  42. 42. 5 INTERSECT  Retorna apenas as linhas retornados pelas duas consultas:
  43. 43. 6 INTERSECT Exemplo: select id_cargo from empregado_horista intersect select id_cargo from empregado_mensalista;
  44. 44. 7 MINUS  Retorna apenas as linhas retornados pela primeira consulta mas não pela segunda:
  45. 45. 8 INTERSECT Exemplo: select id_produto from estoque_central minus select id_produto from estoque_loja
  46. 46. Universidade Presbiteriana Mackenzie Desenvolvimento em BD – Aula5 9 FIM !!! J Linguagem SQL - OPERADORES Prof. Jamilson Bispo dos Santos
  47. 47. Universidade Presbiteriana Mackenzie 1 Banco de Dados - Aula 04 Prof. Jamilson Bispo dos Santos
  48. 48. 2 Visão  Uma visão (view) é uma tabela lógica que não ocupa lugar no banco de dados, pois seus dados não estão fisicamente armazenados sob ela  Uma visão pode ser composta por colunas e agrupamentos de uma ou mais tabelas
  49. 49. 3 Visão  Resumindo, uma visão é resultado de uma consulta  Em uma visão é permitido selecionar, atualizar, excluir e incluir dados. Entretanto, visões que contenham JOIN, GROUP BY, DISTINCT e EXPRESSÕES somente permitem seleções
  50. 50. 4 Visão  Uma visão é criada por uma consulta que usa tabelas de origem ou tabelas base para extrair os dados  As tabelas base podem ser tabelas ou outras visões  A definição de uma visão é armazenada no dicionário de dados que guarda a consulta que gerou a visão
  51. 51. 5 Visão - Vantagens
  52. 52. 6 Visão - Vantagens  Uma das grandes vantagens é poder restringir a visualização do conteúdo de uma tabela por meio da limitação das colunas que são exibidas e das linhas que são filtradas
  53. 53. 7 Visão - Vantagens  Uma tabela de uso geral pode ser quebrada em visões específicas para determinados usuários  Assim, uma tabela com dados de empregados pode exibir apenas o nome e o telefone para usuários em geral, e outra, nome do empregado e o valor do salário apenas para usuários que recebam permissão para isso
  54. 54. 8 Visão - Vantagens  Outra vantagem seria a simplificação da execução de um comando SELECT que envolveria diversos campos de muitas tabelas
  55. 55. Visão – CREATE VIEW 9
  56. 56. 10 Visão – CREATE VIEW  CREATE [OR REPLACE] VIEW nome_view AS SELECT ... WITH READ ONLY;
  57. 57. 11 Visão – CREATE VIEW  OR REPLACE:  recria uma visão já existente. Ela funciona como uma substituta ao inexistente comando ALTER VIEW e deve ser usada para alterar uma visão existente sem a necessidade de apagar e dar a permissão a privilégios
  58. 58. 12 Visão – CREATE VIEW  WITH READ ONLY:  especifica que os comandos DELETE, INSERT ou UPDATE não podem ser executados na visão
  59. 59. 13 Visão – CREATE VIEW  Considere a criação das tabelas Funcionario e Departamento e a inserção de dados nas mesmas
  60. 60. 14 Visão – CREATE VIEW DROP TABLE Funcionario CASCADE CONSTRAINT; DROP TABLE Departamento CASCADE CONSTRAINT; CREATE TABLE Departamento (Cod_Depto integer, Nome_Depto varchar(20), PRIMARY KEY(Cod_Depto)); CREATE TABLE Funcionario (Cod_Func integer, Nome_Func varchar(20), Salario integer, Cod_Depto integer, PRIMARY KEY(Cod_Func), FOREIGN KEY(Cod_Depto) REFERENCES Departamento (Cod_Depto));
  61. 61. 15 Visão – CREATE VIEW INSERT INTO Departamento VALUES (1, ’Marketing’); INSERT INTO Departamento VALUES (2, ’Vendas’); INSERT INTO Departamento VALUES (3, ’Dados’); INSERT INTO Departamento VALUES (4, ’Pesquisa’); INSERT INTO Funcionario VALUES (101, ’Joao da Silva’, 2000, 2); INSERT INTO Funcionario VALUES (102, ’Mario Souza’, 1500, 1); INSERT INTO Funcionario VALUES (103, ’Sergio Santos’, 2400, 2); INSERT INTO Funcionario VALUES (104, ’Maria Castro’, 1200, 1); INSERT INTO Funcionario VALUES (105, ’Marcio Santana’, 1400, 4);
  62. 62. 16 Visão – CREATE VIEW  Exemplo: CREATE OR REPLACE VIEW Funcionario_Depto AS SELECT F.Nome_Func, F.Salario, D.Nome_Depto FROM Funcionario F, Departamento D WHERE F.Cod_Depto = D.Cod_Depto WITH READ ONLY;
  63. 63. 17 Visão – CREATE VIEW  Uma visão pode ser visualizada por um select, da mesma forma que uma tabela: SELECT * FROM Funcionario_Depto;
  64. 64. 18 Visão – DROP VIEW
  65. 65. 19 Visão – DROP VIEW  Para eliminar uma visão, use o comando DROP VIEW seguido do nome dessa visão. As tabelas base não são afetadas por esse comando DROP VIEW nome da visão;
  66. 66. Visão – Alterando dados 20
  67. 67. 21 Visão – Alterando dados  Uma visão que possua apenas colunas de uma tabela pode ser modificada sem restrições e, logo em seguida, exibidas na tabela base (desde que a visão não seja somente leitura)
  68. 68. 22 Visão – Alterando dados  Já uma visão composta por colunas de várias tabelas, pode ser modificada desde que o comando SELECT que a criou não possua:  operador DISTINCT; as funções AVG, COUNT, MAX, MIN, SUM; as operações UNION, INTERSECT, MINUS e as cláusulas GROUP BY, HAVING
  69. 69. 23 Visão – Alterando dados  Se essas restrições forem respeitadas, pode-se usar os comandos UPDATE, INSERT ou DELETE para modificar os dados de uma das tabelas base que a compõem
  70. 70. 24 Visão Visualizando as informações
  71. 71. Visão – Visualizando as informações  Algumas informações sobre as visões criadas são armazenadas em uma tabela de controle, atualizada automaticamente 25  Essa tabela é a user_views
  72. 72. Visão – Visualizando as informações 26  Para conhecer a definição dos dados da tabela user_views, utilize o comando describe DESCRIBE user_views;
  73. 73. Visão – Visualizando as informações 27  Para ver as colunas nome e texto do comando que monta a visão, use as colunas view_name e text SELECT view_name, text FROM user_views;
  74. 74. 28 Visão Materializada
  75. 75. 29 Visão Materializada  As visões materializadas (materialized views) também são associadas a comandos SELECT, no entanto, seu conteúdo fica armazenado em uma tabela no banco de dados  Esse tipo de visão é aplicado a visões com comando SELECT de alta complexidade, degradando a performance das consultas
  76. 76. 30 Visão Materializada  As visões materializadas podem ser utilizadas com o objetivo de sumarizar e/ou pré-calcular dados com base em dados de outras tabelas  Esse uso é especialmente interessante em aplicações de Data Warehouse
  77. 77. Visões do Dicionário de Dados 31  Dicionário de Dados é uma peça importante constituída de um conjunto de tabelas que fornecem informações sobre banco de dados  Todas essas tabelas são usadas apenas para leitura
  78. 78. Visões do Dicionário de Dados  Estas tabelas possuem informações do tipo:  Definições de todos os objetos de esquema do banco de dados, como tabelas, visões, procedures, triggers, dentre outras 32  Os nomes dos usuários, os privilégios e os papéis de cada um
  79. 79. Visões do Dicionário de Dados  O dicionário de dados é uma peça vital para o funcionamento do Oracle  Durante sua operação, o Oracle lê o dicionário de dados para se assegurar de que os objetos do esquema existem e que os usuários possuem permissão para acessá-los 33
  80. 80. Visões do Dicionário de Dados 34  As visões do dicionário são identificadas por prefixos:  USER: visões do usuário  ALL: visões expandidas do usuário  DBA: visões do administrador do banco de dados
  81. 81. Visões do Dicionário de Dados 35  Visões do tipo USER  As informações desse tipo são associadas a informações e objetos de um usuário  Por exemplo: para retornar todos os objetos de um usuário, deve ser usada a visão USER_OBJECTS: SELECT object_name, object_type FROM user_objects;
  82. 82. Visões do Dicionário de Dados 36  Visões do tipo ALL  Essas visões permitem a visualização de informações expandidas do usuário, lhe dando a oportunidade de obter dados, dentro de suas permissões, sobre o banco de dados  Por exemplo: para visualizar todos os objetos dos quais o usuário possui permissão de acesso, deve ser usada a visão ALL_OBJECTS
  83. 83. Visões do Dicionário de Dados 37  Visões do tipo DBA  As visões com esse prefixo mostram uma visão geral do banco de dados e devem ser consultadas, em teoria, apenas por DBA’s
  84. 84. Visões do Dicionário de Dados  A seguir, serão mostradas algumas visões presentes no dicionário de dados, sendo que cada uma contém informações detalhadas sobre cada um dos objetos já estudados 38
  85. 85. Visões do Dicionário de Dados 39 Visão Finalidade ALL_OBJECTS, USER_OBJECTS Mostra todos os objetos do usuário ALL_CATALOG, USER_CATALOG Retorna o nome e o tipo dos objetos do usuário ALL_TABLES, USER_TABLES Retorna as tabelas do usuário ALL_TAB_COLUMNS, USER_TAB_COLUMNS Retorna informações sobre as colunas das tabelas do usuário
  86. 86. Visões do Dicionário de Dados 40 Visão Finalidade ALL_VIEWS, USER_VIEWS Retorna as visões do usuário ALL_TRIGGERS, USER_TRIGGERS Retorna as triggers do usuário ALL_PROCEDURES, USER_PROCEDURES Retorna as procedures do usuário
  87. 87. 41 Bibliografia  FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003.  RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  88. 88. Universidade Presbiteriana Mackenzie 42 FIM !!! J Banco de Dados - Aula 14 Texto original da Profa. Elisângela Botelho Gracias
  89. 89. Universidade Presbiteriana Mackenzie Banco de Dados II Introdução Jamilson Bispo dos Santos Faculdade de Computação e Informática
  90. 90. Tópicos Abordados • Reconhecimento de uma bloco PL/SQL e suas sessões • Descrever o significado das variáveis • Declarar variáveis PL/SQL • Executar um Bloco PL/SQL 2
  91. 91. Bloco PL/SQL DECLARE Variáveis, cursores BEGIN comandos SQL comando PL/SQL EXCEPTION Ações quando ocorrer erro END; mandatório
  92. 92. Bloco PL/SQL DECLARE Variáveis, cursores BEGIN comandos SQL comando PL/SQL EXCEPTION Ações quando ocorrer erro END; mandatório
  93. 93. Bloco PL/SQL • Seção de declaração (Declare) • Contem todos as variáveis, constantes cursores e exceções definidas pelo usuário que são referenciadas na seção de execução • Seção de execução (Begin) • Contem os comando SQL para manipular os dados no banco de dados e os comando PL/SQL para manipular os dados no bloco • Seção de Exceções (Exception) • Especifica as ações a serem tomadas quando um erro ou uma condição anormal acontecer no seção de execução. <Título da Aula> 5
  94. 94. Executando um Bloco PL/SQL DECLARE v_table_name varchar(40); v_table_spacename varchar(40); BEGIN SELECT table_name, tablespace_name INTO v_table_name, v_table_spacename FROM user_tables where table_name = 'ALUNO' ; END;
  95. 95. Executando um Bloco PL/SQL DECLARE v_table_name varchar(40); v_table_spacename varchar(40); v_OutputStr varchar(200) := ''; BEGIN SELECT table_name, tablespace_name INTO v_table_name, v_table_spacename FROM user_tables where table_name = 'ALUNO' ; v_OutputStr := 'Bloco Anonimo '; DBMS_OUTPUT.PUT_LINE(v_OutputStr); v_OutputStr := 'Tabela '||v_table_name; DBMS_OUTPUT.PUT_LINE(v_OutputStr); v_OutputStr := 'Tablespace '||v_table_spacename; DBMS_OUTPUT.PUT_LINE(v_OutputStr); END;
  96. 96. Tipos de Bloco PROCEDURE name IS BEGIN EXCEPTIONS END; FUNCTION name IS BEGIN RETURN valor EXCEPTIONS END;
  97. 97. Construções Programas Descrição Disponivel Bloco Anonimo Bloco PL/SQL anonimos que são coocados dentro de uam aplicação ou executados interativamente Todos os ambiente PL/SQL Aplication Procedure ou functions Blocos PL/SQL armazenados no servidor Oracle Forms Developer ; podem aceirar parametros e podem ser invocados repetidamente pelo nome Oracle Forms Developer Stored Procedure ou Functions Blocos PL/SQL nomeados e armazenados no Oracle server; podem aceitar parametros e podem ser invocados repetidamente pelo nome Oracle Server Packages Modulos PL/SQL que agrupam procedures, functions e identificadores Oracle Server, Oracle Forms Developer Triggers Blocos BP/SQL que são associados com um tabela do banco de dados e são executadas automaticamente quando evento de atualização é executado Oracle Server Application Triggers Estão associados a um evento de um aplicativo e disparados automaticamente Oracle Server, Oracle Forms Developer Tipos de objetos Tipos de dados compostos definidos pelo usuario que encapsula uma estrutura de dados, juntamente com as funções e os procedimentos necessários para manipular os dados Oracle Server, Oracle Forms Developer
  98. 98. Variáveis • Variáveis podem ser usadas para: – Dados temporários – Manipulação de valores armazenados – Reusabilidade – Fácil manutenção <Título da Aula> 10
  99. 99. Variáveis • Variáveis podem ser usadas para: – Armazenamento temporários dos dados • Dados pode ser armazenados temporariamente em uma ou mais variáveis para serem utilizados na entrada dos dados e para serem processados depois. – Manipulação de valores armazenados • Variáveis podem ser usados para cálculos e manipulação de dados sem acesso ao banco de dados. <Título da Aula> 11
  100. 100. Variáveis • Variáveis podem ser usadas para: – Reusabilidade • Depois de serem declaradas as variáveis podem ser usadas repetidamente na aplicação simplesmente sendo referenciadas em outros comandos, incluindo outras comando de declaração – Fácil manutenção • Quando usar %TYPE e %ROWTYPE você declara variáveis com base na declaração da definição da coluna no banco de dados. Isto proporciona uma independência reduzindo custos de manutenção. <Título da Aula> 12
  101. 101. Manipulando Variáveis em PL/SQL • Declarar e inicializar variáveis na declaração da seção • Assinalar um novo valor para a variável na seção de execução • Passar valor através de parâmetro • Visualizar resultado através de variáveis de saída <Título da Aula> 13
  102. 102. Tipos de Variáveis • Variáveis PL/SQL – Escalar • Tipos escalares armazenam um valor único. Os tipo de dados principais são aqueles que correspondem ao tipos de colunas nas tabelas do banco de dados, inclusive valores booleanos. – Composite • Tipos de dados composite , como os registros, permitem que grupos de campos sejam definidos e manipulados no bloco PL/SQL. – Reference • Tipos de dados reference manipulam valores do tipo ponteiros – LOB • Tipo de dados que especificam a localização de objetos do tipo large <Título da Aula> 14
  103. 103. Tipos de Variáveis • Variáveis não PL/SQL – Variáveis não‐PL / SQL incluem variáveis declaras em uma linguagem hospedeira. <Título da Aula> 15
  104. 104. Declaração de Variáveis PL/SQL • Sintaxe: Identificador [constant] tipo de dados [NOT NULL] [:= | DEFAULT expr]; • Exemplos DECLARE v_data DATE: v_depto NUMBER(2) NOT NULL := 10; v_cidade VARCHAR2(20) := ‘São Paulo’; <Título da Aula> 16
  105. 105. Inicialização de Variáveis PL/SQL • Operador de atribuição (:=) • Palavra chave DEFAULT • Constrant NOT NULL Sintaxe identificador := expr; Exemplos v_data :=‘01‐JAN‐2014’; v_depto :=‘RH’; <Título da Aula> 17
  106. 106. Inicialização de Variáveis PL/SQL set serveroutput on size 4000 DECLARE v_bonus number(8, 2); BEGIN SELECT salario * 0.10 INTO v_bonus FROM funcionario WHERE cod_func = 101; DBMS_OUTPUT.PUT_LINE('BONUS '|| v_bonus); END;
  107. 107. Tipos de dados Escalar • CHAR [(tamanho máximo)] • VARCHAR2 (tamanho máximo) • LONG • LONG RAW • NUMBER [precisão, escala] • BINARY_INTEGER • PLS_INTEGER • BOOLEAN <Título da Aula> 19
  108. 108. Tipos escalares Tipo de Dado Descrição Char [(tamanho maximo)] Tipo básico para dados caracteres de no máximo 32.767 bytes. O valor default é 1. varchar2(tamanho maximo) Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. LONG Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. Usar o tipo LONG para armazenar strings de tamanho variável. LONG RAW Tipo básico para dados binários NUMBER [(PRECISÃO, ESCALA)] Tipo numerico com precisão p e escala s. A previsão p pode variar de 1 ate 38. A escala pode variar de ‐ 84 ate 127 BYNARY_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647 PLS_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647. O tipo PLS_INTEGER reque menos memoria e é mais rápido do que variáveis NUMBER BOOLEN Tipo básico que armazena um dos três possíveis valores usados operações logicas: TRUE, FALSE ou NULL
  109. 109. Tipos escalares Tipo de Dado Descrição Char [(tamanho maximo)] Tipo básico para dados caracteres de no máximo 32.767 bytes. O valor default é 1. varchar2(tamanho maximo) Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. LONG Tipo básico para dados caracteres de tamanho variável de no máximo 32.767 bytes. Usar o tipo LONG para armazenar strings de tamanho variável. LONG RAW Tipo básico para dados binários NUMBER [(PRECISÃO, ESCALA)] Tipo numerico com precisão p e escala s. A previsão p pode variar de 1 ate 38. A escala pode variar de ‐ 84 ate 127 BYNARY_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647 PLS_INTEGER Tipo básico para inteiros entre ‐2.147.483.647 até 2.147.483.647. O tipo PLS_INTEGER reque menos memoria e é mais rápido do que variáveis NUMBER BOOLEN Tipo básico que armazena um dos três possíveis valores usados operações logicas: TRUE, FALSE ou NULL
  110. 110. Referencias bibliográficas • KORTH, H., SILBERSCHATZ, A., F., SUDARSHAN, S. Sistema de Bancos de Dados, 6 ed., Campus, 2006. • ELMASRI, R., NAVATHE, S. Sistemas de Banco de Dados. 6 ed., Pearson Addison‐Wesley, 2005 • DATE, C. J. Introdução a sistemas de banco de • dados. Rio de Janeiro: Editora Campus, 2004. 22
  111. 111. Obrigado Profa. Elisângela Botelho Gracias elisangela.botelho@mackenzie.br Prof. Jamilson Bispo dos Santos jamilson.santos@mackenzie.br 23
  112. 112. 1 Universidade Presbiteriana Mackenzie Banco de Dados – Aula 05 Linguagem PL/SQL Prof. Jamilson Bispo dos Santos
  113. 113. 2 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  114. 114. 3 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  115. 115. 4 Introdução  PL/SQL (Program Languagem SQL) é uma extensão da linguagem SQL  Pode-se dizer que é um dialeto da linguagem SQL especializado no banco de dados Oracle  É uma linguagem procedural
  116. 116. 5 Introdução  Por meio da PL/SQL, pode-se criar objetos de esquema, tais como:  Stored procedures  Triggers
  117. 117. 6 Introdução  Stored procedures  Stored procedure, ou procedimento armazenado, é um programa PL/SQL que pode ser acionado por uma aplicação, por um trigger ou uma ferramenta Oracle
  118. 118. 7 Introdução  Triggers  É um programa PL/SQL armazenado no banco de dados e que é executado imediatamente antes ou após os comandos INSERT, UPDATE e DELETE  A diferença principal entre um trigger e uma procedure está no fato de que as procedures são executadas através de uma chamada feita pelo usuário, enquanto os triggers são acionados pelo banco de dados
  119. 119. 8 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  120. 120. 9 Estrutura de um Bloco PL/SQL  A linguagem PL/SQL utiliza o conceito de bloco estruturado  Um bloco PL/SQL é composto por procedures e funções  A estrutura de um bloco PL/SQL é composta por uma área de declaração, uma área de comandos e uma área de exceções
  121. 121. Estrutura de um Bloco PL/SQL 10 DECLARE declarações BEGIN estruturas executáveis (comandos) e outros blocos PL/SQL BEGIN EXCEPTION tratamento de exceções (pode conter outros blocos) END; END;
  122. 122. Estrutura de um Bloco PL/SQL 11  Seção de declaração (DECLARE): todos os objetos são declarados  Seção de execução: os comandos PL/SQL são colocados  Seção de exceção (EXCEPTION): os erros são tratados
  123. 123. Estrutura de um Bloco PL/SQL 12 DECLARE qtdade_itens NUMBER(5); BEGIN SELECT quant INTO qtdade_itens FROM estoque WHERE produto = ‘raquete de tenis’ FOR UPDATE OF quant; IF (quant > 0) THEN UPDATE estoque SET quant = quant – 1 WHERE (produto = ‘raquete de tenis’); INSERT INTO compras VALUES (‘raquete de tenis comprada’, sysdate); ELSE INSERT INTO compras VALUES (‘raquete de tenis em falta’, sysdate); END IF; END;
  124. 124. Estrutura de um Bloco PL/SQL 13  O exemplo anterior faz o seguinte:  Cria uma variável chamada qtdade_itens, usada para armazenar a quantidade de itens disponível no estoque  Essa variável é preenchida com o conteúdo do campo quant da tabela estoque  Depois, através da estrutura IF ELSE, o campo quant é atualizado em função da disponibilidade de raquetes  Se houver disponibilidade, é criado um conteúdo para a tabela compras
  125. 125. Estrutura de um Bloco PL/SQL 14  Seção de Declaração  Seção de Execução  Seção de Exceção
  126. 126. Estrutura de um Bloco PL/SQL 15  Seção de Declaração  Seção de Execução  Seção de Exceção
  127. 127. 16 Seção de Declaração  A primeira seção do bloco PL/SQL, seção de Declaração, é opcional  Contudo, se o bloco usar variáveis ou constantes, todas elas devem ser previamente declaradas antes de serem utilizadas em comandos
  128. 128. 17 Seção de Declaração  Esta seção é iniciada pela palavra-chave DECLARE e o desenvolvedor pode realizar as seguintes tarefas:  Declarar o nome de um identificador  Declarar o tipo do identificador (constante ou variável)  Declarar o tipo de dado do identificador  Atribuir (inicializar) um conteúdo ao identificador
  129. 129. 18 Seção de Declaração Variáveis e Constantes  A linguagem PL/SQL permite a declaração de variáveis e constantes que podem ser usadas em comandos SQL contidos em procedures e funções  Todas as variáveis e constantes usadas devem ser previamente declaradas
  130. 130. 19 Seção de Declaração Variáveis e Constantes  As variáveis podem ter qualquer tipo de dado válido pela linguagem SQL e Oracle:  Char  Varchar2  Number  Date, etc.  Exemplo de declaração de uma variável: DECLARE qtdade_itens NUMBER(5);
  131. 131. 20 Seção de Declaração Variáveis e Constantes  A declaração de uma constante é parecida com a de uma variável, tendo apenas que adicionar a palavra-chave CONSTANT após o seu nome  Exemplo: DECLARE qtdade_itens NUMBER(5); valor_fixo CONSTANT NUMBER(9) := 40000;
  132. 132. Estrutura de um Bloco PL/SQL 21  Seção de Declaração  Seção de Execução  Seção de Exceção
  133. 133. 22 Seção de Execução  A seção de execução do bloco PL/SQL é iniciada com a declaração BEGIN  Esta seção pode conter:  Comando SQL  Comandos de controles lógicos  Comandos de atribuição, dentre outros.
  134. 134. Estrutura de um Bloco PL/SQL 23  Seção de Declaração  Seção de Execução  Seção de Exceção
  135. 135. 24 Seção de Exceção  Na seção de exceção do bloco PL/SQL, o desenvolvedor pode usar comandos para tratar um erro que eventualmente ocorra durante a execução de um programa PL/SQL  Pode-se criar uma rotina que execute procedimentos corretivos ao detectar um erro, evitando, assim, que o sistema fique interrompido
  136. 136. 25 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  137. 137. 26 Funcionamento do PL/SQL  O PL/SQL executa os comandos procedurais e repassa os comandos SQL para o servidor Oracle processar  A criação de blocos PL/SQL pode ser feita por meio de qualquer editor de texto  Para executar um programa ou um script PL/SQL pode-se utilizar o SQL*Plus ou SQL Worsheet, que permite criar, armazenar e executar blocos PL/SQL
  138. 138. 27 Funcionamento do PL/SQL  Como a maioria das linguagens procedurais, o PL/SQL possui comandos para controlar o fluxo de execução do programa  São eles que fazem a diferença, realizando desvios, analisando condições e permitindo a tomada de decisões
  139. 139. 28 Funcionamento do PL/SQL  As principais estruturas de controle do PL/SQL podem ser divididas em:  Estruturas de controles condicionais  Estruturas de controles seqüenciais  Estruturas de controles de repetição ou interação
  140. 140. 29 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  141. 141. 30 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  142. 142. 31 Estruturas de Controle Comando IF ... THEN  O comando IF ... THEN tem por função avaliar uma condição e executar uma ou mais linhas de comandos, somente se essa condição analisada for verdadeira  Esse comando possui 2 variações
  143. 143. 32 Estruturas de Controle Comando IF ... THEN  Sintaxe1 IF <condição> THEN <comando1>; <comandoN>; END IF;
  144. 144. 33 Estruturas de Controle Comando IF ... THEN  Os comandos que se encontram entre a cláusula THEN e END IF serão executados apenas se a <condição> for verdadeira
  145. 145. 34 Estruturas de Controle Comando IF ... THEN  Exemplo: IF salario >= 5000 THEN UPDATE Empregado SET salario = salario * 1.2; END IF;
  146. 146. 35 Estruturas de Controle Comando IF ... THEN  Sintaxe2 IF <condição> THEN <comando1>; ELSIF <condição2> THEN <comando2>; ELSIF <condição3> THEN <comando3>; ELSE <comando4>; END IF;
  147. 147. 36 Estruturas de Controle Comando IF ... THEN  Na estrutura da sintaxe2, mais de uma condição pode ser analisada e, conseqüentemente, diversas ações podem ser executadas  O PL/SQL usa a cláusula ELSIF, e não ELSEIF, como outras linguagens  Um comando pode ter inúmeras cláusulas ELSIF, mas pode possuir apenas uma cláusula ELSE
  148. 148. 37 Estruturas de Controle Comando IF ... THEN  Nesta estrutura, caso a condição principal for falsa, a primeira cláusula ELSIF será analisada e:  se for verdadeira, os comandos a seguir serão executados até que seja encontrada outra cláusula ELSIF ou ELSE  se for falsa, o programa testa a segunda, e assim sucessivamente. Ao encontrar uma condição verdadeira, são executados seus comandos, e o programa continua após a linha do comando END IF
  149. 149. 38 Estruturas de Controle Comando IF ... THEN  Exemplo: IF salario < 2000 THEN UPDATE Empregado SET salario = salario * 1.2; ELSIF salario < 3000 THEN UPDATE Empregado SET salario = salario * 1.3; ELSE UPDATE Empregado SET salario = salario * 1.4; END IF;
  150. 150. 39 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  151. 151. 40 Estruturas de Controle Comando LOOP  O comando LOOP inicializa um grupo de comandos indefinidamente ou até que uma condição force a “quebra” do loop e desvie a execução do programa para outro lugar  Ele é usado em conjunto com o comando EXIT, responsável pela parada de execução do loop
  152. 152. 41 Estruturas de Controle Comando LOOP  Sintaxe LOOP <comandos> EXIT <comandos> END LOOP;
  153. 153. 42 Estruturas de Controle Comando LOOP  Sintaxe (outra versão) LOOP <comandos> EXIT WHEN <condição> <comandos> END LOOP;
  154. 154. 43 Estruturas de Controle Comando LOOP  Exemplo: I := 1; LOOP I := I + 1; <comandos> IF I >= 30 THEN EXIT; END IF; <comandos> END LOOP;
  155. 155. 44 Estruturas de Controle Comando LOOP  Exemplo (outra versão): I := 1; LOOP I := I + 1; <comandos> EXIT WHEN I >= 30; <comandos> END LOOP;
  156. 156. 45 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  157. 157. 46 Estruturas de Controle Comando FOR ... LOOP  O comando FOR ... LOOP é uma variação do comando LOOP  Aqui os comandos são executados automaticamente até que uma condição avaliada retorne falsa
  158. 158. 47 Estruturas de Controle Comando FOR ... LOOP  Sintaxe FOR <contador> IN [REVERSE] <valor_inicial> .. <valor_final> LOOP <comandos> END LOOP;
  159. 159. 48 Estruturas de Controle Comando FOR ... LOOP  Exemplo: FOR j IN 1 .. 10 LOOP <comandos> END LOOP;
  160. 160. 49 Estruturas de Controle Comando FOR ... LOOP  Neste exemplo, o comando FOR inicializa uma variável de controle chamada “j”, cujo valor inicial é 1  Os <comandos> serão executados até encontrar o END LOOP. Nesse momento, o controle volta para o comando FOR, que incrementa a variável e analisa a condição mestra, ou seja, se o valor de j é menor que o valor final
  161. 161. 50 Estruturas de Controle Comando FOR ... LOOP  A cláusula REVERSE faz com que o contador comece no valor mais alto e seja decrescido até atingir o valor mais baixo
  162. 162. 51 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  163. 163. 52 Estruturas de Controle Comando WHILE  Outro controle de execução possível é o uso do comando WHILE  Essa estrutura analisa uma condição e, somente se ela for verdadeira, executa os comandos contidos dentro dessa estrutura
  164. 164. 53 Estruturas de Controle Comando WHILE  Sintaxe WHILE <condição> LOOP <comandos> END LOOP;
  165. 165. 54 Estruturas de Controle Comando WHILE  Exemplo: x := 1 WHILE x < 20 LOOP <comandos> x := x+1; END LOOP;
  166. 166. 55 Funcionamento do PL/SQL Estruturas de Controle  Comando IF ... THEN  Comando LOOP  Comando FOR ... LOOP  Comando WHILE  Comando CASE
  167. 167. 56 Estruturas de Controle Comando CASE  O comando CASE permite avaliar uma expressão e retornar um resultado entre várias alternativas disponíveis
  168. 168. 57 Estruturas de Controle Comando CASE  Sintaxe CASE <expressão> WHEN <expressão1> THEN <resultado1> WHEN <expressão2> THEN <resultado2> ... WHEN <expressãoN> THEN <resultadoN> [ELSE <resultadoN+1>] END;
  169. 169. 58 Estruturas de Controle Comando CASE  Exemplo: resultado := CASE nota WHEN ‘A’ THEN ‘Excelente’ WHEN ‘B’ THEN ‘Muito Bom’ WHEN ‘C’ THEN ‘Bom’ WHEN ‘D’ THEN ‘Razoável’ WHEN ‘E’ THEN ‘Fraco’ ELSE ‘Sem chance’ END;
  170. 170. 59 Roteiro da Apresentação  Introdução  Estrutura de um Bloco PL/SQL  Funcionamento do PL/SQL  Integrando SQL em um programa PL/SQL
  171. 171. 60 Integrando SQL em um programa PL/SQL  Comandos do tipo SQL podem ser inseridos dentro da seção de execução de um bloco PL/SQL e executados quase sem diferença  A maior novidade é que o desenvolvedor pode usar uma variável/constante declarada na seção de declaração  Com isso, além de usar o nome de colunas, o conteúdo de variáveis pode também ser manipulado pelos comandos SQL
  172. 172. 61 Integrando SQL em um programa PL/SQL  Criação da tabela Temp1 no seu esquema para utilizar as estruturas de controle e a criação de variáveis (utilize a Planilha do SQL*PLUS): CREATE TABLE Temp1 (Codigo INTEGER, Data DATE, PRIMARY KEY(Codigo));
  173. 173. 62 Integrando SQL em um programa PL/SQL  Comando WHILE: DECLARE i int := 0; BEGIN WHILE i <= 10 LOOP INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); i := i + 1; END LOOP; END;
  174. 174. 63 Integrando SQL em um programa PL/SQL  Para ver o resultado utilize o comando SELECT: SELECT * FROM Temp1;
  175. 175. 64 Integrando SQL em um programa PL/SQL  Este próximo exemplo é bem semelhante ao anterior, só que é utilizado o comando FOR para executar o loop  Sua vantagem é que não é necessário controlar o incremento da variável de contador por meio da programação
  176. 176. 65 Integrando SQL em um programa PL/SQL  Comando FOR: DECLARE i int := 20; BEGIN FOR i IN 20 .. 30 LOOP INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); END LOOP; END;
  177. 177. 66 Integrando SQL em um programa PL/SQL  Para visualizar o resultado dos novos dados inseridos utilize o comando SELECT: SELECT * FROM Temp1 WHERE (codigo > 10);
  178. 178. 67 Integrando SQL em um programa PL/SQL  Este exemplo utiliza o exemplo anterior, mas acrescenta um teste condicional  Ele insere apenas os registros cujo código seja múltiplo de 3  Para isso, utilize a função MOD
  179. 179. 68 Integrando SQL em um programa PL/SQL  Comando FOR e teste condicional: DECLARE i int := 40; BEGIN FOR i IN 40 .. 50 LOOP IF MOD(i,3) = 0 THEN INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); END IF; END LOOP; END;
  180. 180. 69 Integrando SQL em um programa PL/SQL  Para visualizar o resultado dos novos dados inseridos utilize o comando SELECT: SELECT * FROM Temp1 WHERE (codigo >30);
  181. 181. 70 Integrando SQL em um programa PL/SQL  Este exemplo também utiliza o exemplo anterior, mas o comando IF tem uma cláusula ELSE  Se o valor de i for múltiplo de 3, o registro será inserido normalmente, com o valor de i e a data do sistema  Caso contrário, é feito um cálculo para que seja gravado o valor de i*5 no primeiro campo e a data do sistema somada ao valor de i no segundo campo
  182. 182. 71 Integrando SQL em um programa PL/SQL  Comando FOR e teste condicional com ELSE: DECLARE i int := 60; BEGIN FOR i IN 60 .. 70 LOOP IF MOD(i,3) = 0 THEN INSERT INTO Temp1 (Codigo, Data) VALUES (i, sysdate); ELSE INSERT INTO Temp1 (Codigo, Data) VALUES (i*5, sysdate+i); END IF; END LOOP; END;
  183. 183. 72 Integrando SQL em um programa PL/SQL  Para visualizar o resultado dos novos dados inseridos utilize o comando SELECT: SELECT * FROM Temp1 WHERE (codigo>=60);
  184. 184. 73 Bibliografia  FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003.  RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  185. 185. Universidade Presbiteriana Mackenzie 74 FIM !!! J Banco de Dados – Aula 11 Linguagem PL/SQL Texto original da Profa. Elisângela Botelho Gracias
  186. 186. Universidade Presbiteriana Mackenzie 1 Banco de Dados - Aula 06 Procedure Prof. Jamilson Bispo dos Santos
  187. 187. 2 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  188. 188. 3 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  189. 189. 4 Procedure  Conceito de Procedure  Uma stored procedure é um grupo de comandos SQL e PL/SQL que executam uma determinada tarefa
  190. 190. 5 Procedure  Ao contrário de um trigger, que é executado automaticamente quando um evento de disparo ocorre, uma procedure precisa ser chamada a partir de um programa ou ser executada manualmente pelo usuário
  191. 191. 6 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  192. 192. 7 CREATE PROCEDURE CREATE [OR REPLACE] PROCEDURE nome_da_procedure (Argumento1 modo Tipo_de_Dados, Argumento2 modo Tipo_de_Dados, ArgumentoN modo Tipo_de_Dados) IS variáveis locais, constantes, ... BEGIN Bloco PL/SQL END nome_da_procedure;
  193. 193. 8 CREATE PROCEDURE  OR REPLACE: recria uma procedure já existente, sem ter que eliminá-la  Argumento: é o nome da variável que será enviada ou retornada do ambiente chamador para a procedure e pode ser passada em um dos 3 modos (IN, OUT, IN OUT)
  194. 194. 9 CREATE PROCEDURE  IN: especifica que se deve determinar um valor para o argumento quando o procedimento for chamado  OUT: especifica que o procedimento devolve um valor para esse argumento quando o procedimento for chamado  IN OUT: especifica que se deve determinar um valor para o argumento quando o procedimento for chamado, e que o procedimento devolve um valor ao seu ambiente de chamada após sua execução
  195. 195. 10 CREATE PROCEDURE  Tipo_de_dados: é o tipo de dado do argumento, que são especificados sem comprimento, precisão ou escala (por exemplo VARCHAR). O Oracle deriva o comprimento, precisão ou escala de um argumento do ambiente a partir do qual o procedimento é chamado
  196. 196. 11 CREATE PROCEDURE  BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
  197. 197. 12 CREATE PROCEDURE  Exemplo1:  deseja-se criar uma procedure que aumente o salário de todos os empregados em 10%  para este exemplo crie a seguinte tabela Funcionarios com os atributos: Cod_func, Nome_Func, Salario e Cod_Depto (insira alguns dados nesta tabela)
  198. 198. 13 CREATE PROCEDURE CREATE TABLE Funcionarios (Cod_Func integer, Nome_Func varchar(20), Salario integer, Cod_Depto integer, PRIMARY KEY(Cod_Func)); INSERT INTO Funcionarios VALUES (1, ’Joao’, 2000, 2); INSERT INTO Funcionarios VALUES (2, ’Ana’, 2500, 1);
  199. 199. 14 CREATE PROCEDURE CREATE OR REPLACE PROCEDURE Aumento_Salario IS BEGIN UPDATE Funcionarios SET Salario = Salario * 1.1; END Aumento_Salario;
  200. 200. 15 CREATE PROCEDURE  A execução de uma procedure é feita por meio de uma chamada ao seu nome  Pode ser feita dentro de um trigger ou de outra procedure, bastando especificar o nome da procedure  A partir do SQL*Plus, uma procedure pode ser chamada por meio do comando EXECUTE  Exemplo: EXECUTE Aumento_Salario;
  201. 201. 16 CREATE PROCEDURE  Observe, agora, os dados da tabela Funcionarios SELECT * FROM Funcionarios;
  202. 202. 17 CREATE PROCEDURE  Exemplo2 (procedure com parâmetros):  deseja-se criar uma procedure que aumente os salários dos funcionários  só que desta vez os salários serão aumentados somente para os funcionários de um determinado departamento e com um percentual diferente
  203. 203. 18 CREATE PROCEDURE CREATE OR REPLACE PROCEDURE Aumento_Salario_Depto (vdepto IN Funcionarios.Cod_Depto%type, percentual number) IS BEGIN UPDATE Funcionarios SET Salario = Salario * (1 + percentual/100) WHERE (Cod_Depto = vdepto); END Aumento_Salario_Depto;
  204. 204. 19 CREATE PROCEDURE  Executando a procedure criada no exemplo2:  EXECUTE Aumento_Salario_Depto(1,20);  A execução desta procedure com os argumentos acima fará o seguinte: aumentará em 20% os salários dos empregados que são do departamento de código = 1
  205. 205. 20 CREATE PROCEDURE  Observe, novamente, como os dados dos funcionários cujo cod_depto = 1 foram atualizados: SELECT * FROM Funcionarios WHERE (Cod_depto = 1);
  206. 206. 21 Roteiro da Apresentação  Procedure  CREATE PROCEDURE  Excluindo uma Procedure
  207. 207. 22 Excluindo uma Procedure  Para excluir uma procedure deve ser usado o comando:  DROP PROCEDURE nome_da_procedure;  Exemplo: DROP PROCEDURE Aumenta_Salario;
  208. 208. 23 Bibliografia  FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003.  RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  209. 209. Universidade Presbiteriana Mackenzie 24 FIM !!! J Banco de Dados - Aula 13 Procedure Texto original da Profa. Elisângela Botelho Gracias
  210. 210. Universidade Presbiteriana Mackenzie Banco de Dados II - Aula 06 Funções Profa. Elisângela Botelho Gracias Faculdade de Computação e Informática 1
  211. 211. 2 Funções • Funções são subprogramas que tem por objetivo retornar algum resultado ou valor • A função pode ser invocada por meio de um comando SELECT e também usada em cálculos como outra função do Oracle (já que ela sempre retorna um valor)
  212. 212. 3 Funções • Uma função é muito parecida com uma stored procedure • A principal diferença entre ambas está no fato de que uma função, obrigatoriamente, deve retornar um valor por meio da cláusula RETURN
  213. 213. 4 CREATE FUNCTION CREATE [OR REPLACE] FUNCTION nome_da_funcao (Argumento1 IN Tipo_de_Dados, Argumento2 IN Tipo_de_Dados, ArgumentoN IN Tipo_de_Dados) RETURN Tipo_de_Dado IS declarações BEGIN Bloco PL/SQL END nome_da_funcao;
  214. 214. 5 CREATE FUNCTION • OR REPLACE: recria uma função já existente, sem ter que eliminá-la • Argumento: é o nome do argumento da função, ou seja, é o nome da variável que será enviada para a função. Nunca utilize para um argumento um nome de um atributo de uma tabela que esteja utilizando nesta função • IN: especifica que se deve determinar um valor para o argumento quando a função for chamada
  215. 215. 6 CREATE FUNCTION • Tipo_de_dados: é o tipo de dado do argumento, que são especificados sem comprimento, precisão ou escala (por exemplo: VARCHAR). O Oracle deriva o comprimento, precisão ou escala de um argumento do ambiente a partir do qual a função é utilizada – Uma outra forma de atribuir o tipo de dado a um argumento é herdar o tipo de dados de um atributo de uma tabela da seguinte maneira: nome_tabela.nome_atributo%type
  216. 216. 7 CREATE FUNCTION • RETURN Tipo_de_Dado: especifica o tipo de dado do valor de retorno da função • BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
  217. 217. 8 CREATE FUNCTION Considere o seguinte Banco de Dados para os exemplos desta aula: Departamento = {Cod_Depto, Nome_Depto} Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} - Cod_depto é chave estrangeira que referencia o atributo Cod_depto da tabela Departamento Projeto = {Cod_Proj, Nome_Proj, Duracao} Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} - Cod_Func é chave estrangeira que referencia o atributo Cod_Func da tabela Funcionario - Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj da tabela Projeto
  218. 218. 9
  219. 219. 10 SELECT
  220. 220. 11 -- Script de Criação do BD Projeto DROP TABLE Func_Proj CASCADE CONSTRAINT; DROP TABLE Projeto CASCADE CONSTRAINT; DROP TABLE Funcionario CASCADE CONSTRAINT; DROP TABLE Departamento CASCADE CONSTRAINT; CREATE TABLE Departamento (Cod_Depto INTEGER, Nome_Depto VARCHAR(20) NOT NULL, PRIMARY KEY(Cod_Depto)); CREATE TABLE Funcionario (Cod_Func INTEGER, Nome_Func VARCHAR(20) NOT NULL, Salario INTEGER NOT NULL, Cod_Depto INTEGER NOT NULL, PRIMARY KEY(Cod_Func), FOREIGN KEY (Cod_Depto) REFERENCES Departamento (Cod_Depto)); CREATE TABLE Projeto (Cod_Proj INTEGER, Nome_Proj VARCHAR(20) NOT NULL, Duracao INTEGER NOT NULL, PRIMARY KEY(Cod_Proj)); CREATE TABLE Func_Proj (Cod_Func INTEGER, Cod_Proj INTEGER, Horas_Trab INTEGER, PRIMARY KEY(Cod_Func, Cod_Proj), FOREIGN KEY (Cod_Func) REFERENCES Funcionario(Cod_Func), FOREIGN KEY (Cod_Proj) REFERENCES Projeto(Cod_Proj));
  221. 221. 12 INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (1, 'Marketing'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (2, 'Vendas'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (3, 'Dados'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (4, 'Pesquisa'); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (101, 'Joao da Silva ', 2000, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (102, 'Mario Souza', 1500, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (103, 'Sergio Santos', 2400, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (104, 'Maria Castro', 1200, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (105, 'Marcio Santana', 1400, 4); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1001, 'SistemaA', 2); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1002, 'SistemaB', 6); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1003, 'SistemaX', 4); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1001, 24); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1002, 160); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1001, 56); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1003, 45); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1001, 86); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1003, 64); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (104, 1001, 46); COMMIT;
  222. 222. 13 CREATE FUNCTION • Exemplo1: – deseja-se criar uma função que retorne a quantidade de funcionários de um determinado departamento – para isso, a função receberá como argumento o código do departamento que será totalizado
  223. 223. 14 CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Emp_Depto (vdepto IN Funcionario.Cod_Depto%type) RETURN INTEGER IS emptotal INTEGER; BEGIN SELECT COUNT(*) INTO emptotal FROM Funcionario WHERE (Cod_Depto = vdepto); RETURN emptotal; END Total_Emp_Depto;
  224. 224. 15 CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Emp_Depto (vdepto IN Funcionario.Cod_Depto%type) RETURN INTEGER IS emptotal INTEGER; BEGIN SELECT COUNT(*) INTO emptotal FROM Funcionario WHERE (Cod_Depto = vdepto); RETURN emptotal; END Total_Emp_Depto; Não se esquecer de retornar o valor da função
  225. 225. 16 CREATE FUNCTION • Se a função não foi compilada com sucesso (corretamente) ou contém erros, pode-se utilizar o seguinte comando para que o Oracle aponte o erro: SHOW ERRORS;
  226. 226. 17 CREATE FUNCTION • No exemplo anterior, é inserido apenas o código do departamento como argumento da função • Em seguida, é especificado que a função retorna um dado do tipo integer • É criada uma variável chamada emptotal, que receberá o total de funcionários do departamento
  227. 227. 18 Utilizando uma Função • Para exibir o resultado de uma função, deve-se utilizar o comando SELECT, especificando o nome da função que está sendo pesquisada na tabela DUAL (que é uma tabela do sistema), juntamente com o(s) valor(es) do(s) argumento(s) da função • Exemplo: SELECT Total_Emp_Depto(1) FROM DUAL;
  228. 228. 19 CREATE FUNCTION • Exemplo2: – deseja-se criar uma função que retorne o total gasto em salário pago aos funcionários de um determinado departamento (será passado o nome do departamento) – para isso, a função receberá como argumento o nome do departamento que deseja-se saber o total gasto com salário pago aos funcionários
  229. 229. 20 CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Salario_Depto (ndepto IN Departamento.Nome_Depto%type) RETURN INTEGER IS total INTEGER; BEGIN SELECT SUM(F.Salario) INTO total FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) WHERE (D.Nome_Depto = ndepto) ; RETURN total; END Total_Salario_Depto;
  230. 230. CREATE FUNCTION CREATE OR REPLACE FUNCTION Total_Salario_Depto (ndepto IN Departamento.Nome_Depto%type) RETURN INTEGER IS total INTEGER; BEGIN SELECT SUM(F.Salario) INTO total FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) WHERE (D.Nome_Depto = ndepto) ; RETURN total; END Total_Salario_Depto; 21
  231. 231. 22 CREATE FUNCTION • No exemplo anterior, é inserido apenas o nome do departamento como argumento da função • Em seguida, é especificado que a função retorna um dado do tipo INTEGER • É criada uma variável chamada total, que receberá a soma dos salários pagos em um determinado departamento
  232. 232. Utilizando uma Função • É possível utilizar a função criada em uma consulta, como, por exemplo: selecione o nome de cada departamento e o total gasto em salário em cada departamento, mas retorne somente os departamentos que gastam mais que o departamento de ‘Marketing’. SELECT D.Nome_Depto, SUM(F.Salario) FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) GROUP BY D.Nome_Depto HAVING SUM(F.Salario) > Total_Salario_Depto ('Marketing'); 23
  233. 233. Executando uma Função • É possível utilizar a função criada em uma consulta, como, por exemplo: selecione o nome de cada departamento e o total Utilizando a função gasto em salário em cada departamento, mas retorne somente Total_Salario_Depto, os departamentos que gastam mais que o departamento de criada anteriormente, ‘Marketing’. SELECT D.Nome_Depto, SUM(na F.consulta Salario) FROM Funcionario F INNER JOIN Departamento D ON (F.Cod_Depto = D.Cod_Depto) GROUP BY D.Nome_Depto HAVING SUM(F.Salario) > Total_Salario_Depto ('Marketing'); 24
  234. 234. 25 Excluindo uma Função • Para excluir uma função deve ser usado: DROP FUNCTION nome_da_funcao; • Exemplo: DROP FUNCTION Total_Salario_Depto;
  235. 235. 26 EXERCÍCIO RESOLVIDO • Crie uma função que retorne o quanto um funcionário irá receber pelo número de horas trabalhadas, considerando que serão passados, como argumentos, o nome do funcionário e o valor de cada hora trabalhada
  236. 236. 27 CREATE OR REPLACE FUNCTION Total_Pago (nfunc IN VARCHAR, valor IN INTEGER) RETURN INTEGER IS total INTEGER; vcodfunc INTEGER; BEGIN SELECT Cod_Func INTO vcodfunc FROM Funcionario WHERE (Nome_Func = nfunc) ; SELECT SUM(Horas_Trab) * valor INTO total FROM Func_Proj WHERE (Cod_Func = vcodfunc ) ; RETURN total; END Total_Pago;
  237. 237. 28 CREATE OR REPLACE FUNCTION Total_Pago (nfunc IN VARCHAR, valor IN INTEGER) RETURN INTEGER IS total INTEGER; vcodfunc INTEGER; BEGIN SELECT Cod_Func INTO vcodfunc FROM Funcionario WHERE (Nome_Func = nfunc) ; SELECT SUM(Horas_Trab) * valor INTO total FROM Func_Proj WHERE (Cod_Func = vcodfunc ) ; RETURN total; END Total_Pago; Argumentos da função Tipo de dado que será retornado Variáveis locais SELECT para retornar o código do funcionário Retorno do valor da função SELECT para retornar o total a ser pago ao funcionário
  238. 238. 29 EXERCÍCIO RESOLVIDO • Para exibir o resultado de uma função, deve-se utilizar o comando SELECT na tabela Dual: SELECT Total_Pago('Mario Souza', 50) FROM DUAL;
  239. 239. 30 EXERCÍCIOS 1) Crie uma função que retorne o nome do departamento que um determinado funcionário pertence, considerando que será passado, como argumento, somente o nome do funcionário. 1) Crie uma função que retorne o total de horas utilizadas pelos funcionários em um determinado projeto, considerando que será passado, como argumento, somente o nome do projeto.
  240. 240. 31 Bibliografia • FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003. • RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  241. 241. Obrigado Profa. Elisângela Botelho Gracias elisangela.botelho@mackenzie.br 32
  242. 242. Universidade Presbiteriana Mackenzie Banco de Dados II - Aula 07 Trigger Profa. Elisângela Botelho Gracias Faculdade de Computação e Informática 1
  243. 243. 2 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  244. 244. 3 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  245. 245. 4 Trigger • Conceito de Triggers – São blocos PL/SQL disparados automaticamente e implicitamente sempre que ocorre um evento associado a uma tabela ou visão (INSERT, UPDATE ou DELETE)
  246. 246. 5 Trigger • O nome trigger, que significa gatilho em inglês, traduz bem o seu funcionamento • Ele é disparado quando os comando INSERT, UPDATE ou DELETE são executados • A principal aplicação de um trigger é a criação de consistências e restrições de acesso ao banco de dados
  247. 247. 6 Trigger • Os triggers podem ser utilizados para: – Implementação de regras de negócios – Geração de valores calculados – Manutenção da integridade referencial dos dados – Replicação de dados – Manutenção de registro histórico de alterações ocorridas no banco de dados
  248. 248. 7 Trigger • Os triggers podem ser utilizados para (continuação): – Criar o conteúdo de uma coluna derivada de outras colunas – Criar mecanismos de validação que envolvam pesquisas em múltiplas tabelas – Atualizar outras tabelas em função de inclusão ou alteração da tabela atual, etc.
  249. 249. 8 Trigger • Um trigger está associado a uma tabela e, em alguns casos, a uma visão • Quando uma visão é utilizada, os triggers da tabela base são normalmente acionados
  250. 250. 9 Trigger • Um trigger pode fazer o papel de uma restrição (constraint) para forçar alguma regra de integridade • Mas se uma tarefa puder ser feita tanto com triggers quanto com uma restrição já implementada no banco, use a restrição como primeira opção
  251. 251. Trigger • Os triggers, neste caso, deveriam ser usados apenas quando uma regra de integridade referencial não puder ser executada usando as restrições conhecidas, como: – NOT NULL, PRIMARY KEY, FOREIGN KEY, etc. 10
  252. 252. Trigger • Os triggers oferecem um mecanismo poderoso para tratar as alterações em um banco de dados, mas eles devem ser usados com muito cuidado • Isso porque o efeito de vários triggers pode ser muito complexo e a execução de um trigger pode ativar outro trigger, e este ativa o trigger anterior novamente, gerando uma recursão 11
  253. 253. 12 Trigger • Tempo do trigger: – O tempo do trigger indica quando ele será disparado em relação à execução do evento – Os tempos podem ser BEFORE (antes do evento) ou AFTER (depois do evento)
  254. 254. 13 Trigger • Evento de disparo do trigger: – O evento de disparo indica qual a operação de manipulação de dados efetuada sobre uma tabela (ou visão) que vai disparar o trigger – Os eventos de disparo podem ser: INSERT, UPDATE ou DELETE
  255. 255. 14 Trigger • O tipo de trigger indica quantas vezes ele poderá ser disparado em uma tabela – Comando: associada ao comando como um todo, é acionada antes ou depois de um evento – Linha: acionada uma vez para cada linha afetada pelo evento ao qual o trigger estiver associado
  256. 256. 15 Trigger • Regras para a criação de triggers: – O número máximo de triggers possíveis para uma tabela é doze, ou seja, todas as combinações possíveis entre tempos, eventos de disparo e tipos de triggers – Não é permitida a criação de triggers com o mesmo tempo, evento de disparo e tipo de trigger para uma mesma tabela (ou visão)
  257. 257. 16 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  258. 258. 17 CREATE TRIGGER CREATE [OR REPLACE] TRIGGER nome_da_trigger BEFORE/AFTER DELETE OR INSERT OR UPDATE [OF nome_coluna1, nome_coluna2, ...] ON nome_da_tabela [FOR EACH ROW] [REFERENCING, OLD AS nome NEW AS nome] [WHEN condição] BLOCO PL/SQL
  259. 259. 18 CREATE TRIGGER • OR REPLACE: recria um trigger já existente, sem ter que eliminá-lo • BEFORE: faz o Oracle disparar o trigger antes de executar o comando de disparo • AFTER: faz o Oracle disparar o trigger após a execução do comando de disparo
  260. 260. 19 CREATE TRIGGER • DELETE: faz o Oracle disparar o trigger sempre que um comando DELETE eliminar uma linha da tabela • INSERT: faz o Oracle disparar o trigger sempre que um comando INSERT adicionar uma linha à tabela • UPDATE: faz o Oracle disparar o trigger sempre que um comando UPDATE alterar um valor em uma das colunas especificadas na cláusula OF. Se não for especificado nenhum atributo, sempre que ocorrer qualquer atualização, o trigger será disparado
  261. 261. 20 CREATE TRIGGER • ON: especifica o nome da tabela (ou visão) • REFERENCING: especifica nomes de correlação • FOR EACH ROW: designa um trigger como um trigger de linha. O Oracle dispara um trigger de linha para cada linha que for afetada por um comando de disparo
  262. 262. 21 CREATE TRIGGER • WHEN: utilizada para restringir as linhas que irão disparar o trigger (ou seja, uma condição que precisa ser atendida para o Oracle disparar o trigger) • BLOCO PL/SQL: é o bloco PL/SQL que o Oracle executa
  263. 263. 22 CREATE TRIGGER • Referências aos valores dos atributos da tabela que disparou o trigger, dentro de um trigger: – Dentro de um trigger é possível acessar o valor de um atributo de uma linha, podendo-se obter tanto o valor antigo (:old) quanto o novo valor (:new) – Para o comando INSERT, os valores dos atributos que serão gravados devem ser precedidos por :new.nome_do_atributo
  264. 264. CREATE TRIGGER • Referências aos valores dos atributos da tabela que disparou o trigger, dentro de um trigger: – Para o comando DELETE, os valores dos atributos da linha que está sendo processada devem ser precedidos por :old.nome_do_atributo – Para o comando UPDATE, o valor original que está gravado é acessado por :old.nome_do_atributo e os novos valores que serão gravados devem ser precedidos por :new.nome_do_atributo 23
  265. 265. 24 CREATE TRIGGER • Dentro dos triggers são disponibilizados predicados para testar o evento que dispara o trigger e realizar uma ação de acordo com cada um deles. Esses predicados são: – inserting: retorna true se o trigger foi disparado por um comando INSERT – updating: retorna true se o trigger foi disparado por um comando UPDATE – deleting: retorna true se o trigger foi disparado por um comando DELETE
  266. 266. 25 CREATE TRIGGER Considere o seguinte Banco de Dados para os exemplos desta aula: Departamento = {Cod_Depto, Nome_Depto} Funcionario = {Cod_Func, Nome_Func, Salario, Cod_Depto} - Cod_depto é chave estrangeira que referencia o atributo Cod_depto da tabela Departamento Projeto = {Cod_Proj, Nome_Proj, Duracao} Func_Proj = {Cod_Func, Cod_Proj, Horas_Trab} - Cod_Func é chave estrangeira que referencia o atributo Cod_Func da tabela Funcionario - Cod_Proj é chave estrangeira que referencia o atributo Cod_Proj da tabela Projeto
  267. 267. 26
  268. 268. 27 CREATE TRIGGER • Inicialmente, este banco de dados está vazio, mas ao longo desta aula iremos inserir dados para observar o comportamento dos triggers que serão criados
  269. 269. 28 -- Script de Criação do BD Projeto DROP TABLE Func_Proj CASCADE CONSTRAINT; DROP TABLE Projeto CASCADE CONSTRAINT; DROP TABLE Funcionario CASCADE CONSTRAINT; DROP TABLE Departamento CASCADE CONSTRAINT; CREATE TABLE Departamento (Cod_Depto INTEGER, Nome_Depto VARCHAR(20) NOT NULL, PRIMARY KEY(Cod_Depto)); CREATE TABLE Funcionario (Cod_Func INTEGER, Nome_Func VARCHAR(20) NOT NULL, Salario INTEGER NOT NULL, Cod_Depto INTEGER NOT NULL, PRIMARY KEY(Cod_Func), FOREIGN KEY (Cod_Depto) REFERENCES Departamento (Cod_Depto)); CREATE TABLE Projeto (Cod_Proj INTEGER, Nome_Proj VARCHAR(20) NOT NULL, Duracao INTEGER NOT NULL, PRIMARY KEY(Cod_Proj)); CREATE TABLE Func_Proj (Cod_Func INTEGER, Cod_Proj INTEGER, Horas_Trab INTEGER, PRIMARY KEY(Cod_Func, Cod_Proj), FOREIGN KEY (Cod_Func) REFERENCES Funcionario(Cod_Func), FOREIGN KEY (Cod_Proj) REFERENCES Projeto(Cod_Proj));
  270. 270. 29 CREATE TRIGGER • Crie mais uma tabela, Criacao_Depto, que será utilizada no próximo exemplo1 de trigger: CREATE TABLE Criacao_Depto( Cod_Depto INTEGER, Nome_Depto VARCHAR(40), Dt_criacao DATE, PRIMARY KEY(Cod_Depto));
  271. 271. 30 CREATE TRIGGER • Exemplo1: – deseja-se criar um trigger que será disparado quando um novo departamento for inserido – quando este evento ocorrer, o trigger deverá inserir uma nova linha na tabela Criacao_Depto com o código e nome do novo departamento e a data que ele foi inserido no banco de dados
  272. 272. 31 CREATE TRIGGER CREATE OR REPLACE TRIGGER Depto_Criacao AFTER INSERT ON Departamento FOR EACH ROW BEGIN INSERT INTO Criacao_Depto(Cod_depto,Nome_Depto,Dt_criacao) VALUES (:new.Cod_Depto,:new.Nome_Depto,sysdate); END;
  273. 273. 32 CREATE TRIGGER CREATE OR REPLACE TRIGGER Depto_Criacao AFTER INSERT Novo valor do código Novo valor do nome do do departamento que departamento que ON Departamento acabou de ser acabou de ser inserido FOR EACH ROW inserido na tabela na tabela Departamento Departamento BEGIN INSERT INTO Criacao_Depto(Cod_depto,Nome_Depto,Dt_criacao) VALUES (:new.Cod_Depto,:new.Nome_Depto,sysdate); END;
  274. 274. 33 CREATE TRIGGER • Se o trigger não for compilado com sucesso (corretamente) ou contém erros, pode-se utilizar o seguinte comando, para que o Oracle aponte o erro: SHOW ERRORS;
  275. 275. 34 CREATE TRIGGER • Se você inserir um novo departamento na tabela Departamento, observe o que acontecerá com a tabela Criacao_Depto!! • Será que o trigger criado realmente está funcionando?
  276. 276. 35 CREATE TRIGGER • Insira um novo departamento na tabela Departamento: INSERT INTO Departamento (Cod_Depto,Nome_Depto) VALUES (5, 'Desenvolvimento');
  277. 277. 36 CREATE TRIGGER • Observe, agora, os dados inseridos na tabela Criacao_Depto pelo trigger: SELECT * FROM Criacao_Depto;
  278. 278. 37 CREATE TRIGGER • Crie as tabelas Total_Horas e Historico_Salario que serão utilizadas no próximo exemplo2 : CREATE TABLE Total_Horas ( Cod_Func INTEGER, Total INTEGER, PRIMARY KEY(Cod_Func)); CREATE TABLE Historico_Salario ( Cod_Func INTEGER, Salario_Antigo INTEGER, Salario_Atual INTEGER, PRIMARY KEY(Cod_Func, Salario_Antigo, Salario_Atual));
  279. 279. 38 CREATE TRIGGER • Exemplo2: – crie um trigger que deverá ser disparado quando um novo funcionário for inserido ou quando o salário for atualizado – se um novo funcionário for inserir, esse trigger deverá inserir uma nova linha na tabela Total_Horas com o código do funcionário e zero para o total de horas, já que ele acabou de ser inserido no banco de dados
  280. 280. 39 CREATE TRIGGER • Exemplo2: – se o salário do funcionário for atualizado, esse trigger deverá inserir uma nova linha na tabela Historio_Salario com o código do funcionário, o valor do salário antes da atualização e o novo salário (após a atualização)
  281. 281. 40 CREATE TRIGGER CREATE OR REPLACE TRIGGER Insere_Func BEFORE INSERT OR UPDATE OF Salario ON Funcionario FOR EACH ROW BEGIN IF inserting THEN INSERT INTO Total_Horas (Cod_Func, Total) VALUES (:new.Cod_func, 0); ELSIF updating THEN INSERT INTO Historico_Salario (Cod_Func, Salario_Antigo, Salario_Atual) VALUES (:old.Cod_func, :old.Salario, :new.Salario); END IF; END;
  282. 282. 41 CREATE TRIGGER CREATE OR REPLACE TRIGGER Insere_Func BEFORE INSERT OR UPDATE OF Salario ON Funcionario FOR EACH ROW BEGIN IF inserting THEN INSERT INTO Total_Horas (Cod_Func, Total) VALUES (:new.Cod_func, 0); ELSIF updating THEN INSERT INTO Historico_Salario (Cod_Func, Salario_Antigo, Salario_Atual) VALUES (:old.Cod_func, :old.Salario, :new.Salario); END IF; END; O trigger vai ser disparado somente quando houver a inserção de um funcionário ou a atualização do salário na tabela Funcionario Se o trigger foi disparado pela inserção, uma nova linha será inserida na tabela Total_Horas Se o trigger foi disparado pela atualização do salário, uma nova linha será inserida na tabela Historico_Salario
  283. 283. 42 CREATE TRIGGER • Se você inserir um ou mais funcionários na tabela Funcionário, observe o que acontecerá com a tabela Total_Horas!!! • Será que o trigger criado realmente está funcionando?
  284. 284. 43 CREATE TRIGGER • Insira alguns departamentos e, logo após, alguns funcionários: INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (1, 'Marketing'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (2, 'Vendas'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (3, 'Dados'); INSERT INTO Departamento (Cod_Depto, Nome_Depto) VALUES (4, 'Pesquisa'); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (101, 'Joao da Silva ', 2000, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (102, 'Mario Souza', 1500, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (103, 'Sergio Santos', 2400, 2); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (104, 'Maria Castro', 1200, 1); INSERT INTO Funcionario (Cod_Func, Nome_Func, Salario, Cod_Depto) VALUES (105, 'Marcio Santana', 1400, 4);
  285. 285. 44 CREATE TRIGGER • Observe, agora: – os dados inseridos na tabela Criacao_Depto devido ao trigger do exemplo1 SELECT * FROM Criacao_Depto; – os dados inseridos na tabela Total_Horas pelo trigger criado anteriormente SELECT * FROM Total_Horas;
  286. 286. 45 CREATE TRIGGER • Atualize o salário de algum funcionário: UPDATE Funcionario SET Salario = 7000 WHERE (Cod_Func = 103); • Observe, agora, os dados inseridos na tabela Historico_Salario devido ao trigger criado anteriormente: SELECT * FROM Historico_Salario;
  287. 287. 46 CREATE TRIGGER • Crie a tabela Qtdade_Func que será utilizada no próximo exemplo3 de trigger: CREATE TABLE Qtdade_Func ( Cod_Proj INTEGER, Qtdade INTEGER, PRIMARY KEY(Cod_Proj) );
  288. 288. 47 CREATE TRIGGER • Exemplo3: – crie um trigger que deverá ser disparado quando um novo projeto for inserido – esse trigger deverá inserir uma nova linha na tabela Qtdade_Func com o código do projeto e zero para o total de funcionários, já que ele acabou de ser inserido no banco de dados
  289. 289. 48 CREATE TRIGGER CREATE OR REPLACE TRIGGER Insere_Proj AFTER INSERT ON Projeto FOR EACH ROW BEGIN INSERT INTO Qtdade_Func (Cod_Proj, Qtdade) VALUES (:new.Cod_proj, 0); END;
  290. 290. 49 CREATE TRIGGER • Se você inserir um ou mais projetos na tabela Projeto, observe o que acontecerá com a tabela Qtdade_Func!!! • Será que o trigger criado realmente está funcionando?
  291. 291. 50 CREATE TRIGGER • Insira alguns projetos: INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1001, 'SistemaA', 2); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1002, 'SistemaB', 6); INSERT INTO Projeto (Cod_Proj, Nome_Proj, Duracao) VALUES (1003, 'SistemaX', 4);
  292. 292. 51 CREATE TRIGGER • Observe, agora, os dados inseridos na tabela Qtdade_Func devido ao trigger criado anteriormente: SELECT * FROM Qtdade_Func;
  293. 293. 52 CREATE TRIGGERE • Exemplo4: – deseja-se criar um trigger que deve ser disparado quando uma nova linha for inserida na tabela Func_Proj
  294. 294. 53 CREATE TRIGGERE • Exemplo4: – se for inserida uma nova linha, então o trigger deve: • atualizar o atributo Total da tabela Qtdade_Func em mais 1, para aquele código de projeto inserido • a mesma coisa deve ser feita para a tabela Total_Horas, ou seja, atualizar a quantidade total de horas que aquele funcionário trabalhou nos projetos
  295. 295. 54 CREATE TRIGGER CREATE OR REPLACE TRIGGER Atualiza_Qtdade AFTER INSERT ON Func_Proj FOR EACH ROW BEGIN UPDATE Total_Horas SET Total = Total + :new.Horas_Trab WHERE (Cod_Func = :new.Cod_Func); UPDATE Qtdade_Func SET Qtdade = Qtdade + 1 WHERE (Cod_Proj = :new.Cod_Proj); END;
  296. 296. 55 CREATE TRIGGER • Se você inserir uma linha ou mais na tabela Func_Proj, observe o que acontecerá com as tabelas Qtdade_Func e Total_Horas!!! • Será que o trigger criado realmente está funcionando?
  297. 297. 56 CREATE TRIGGER • Insira algumas linhas na tabela Func_Proj: INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1001, 24); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (101, 1002, 160); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1001, 56); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (102, 1003, 45); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1001, 86); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (103, 1003, 64); INSERT INTO Func_Proj (Cod_Func, Cod_Proj, Horas_Trab) VALUES (104, 1001, 46);
  298. 298. 57 CREATE TRIGGER • Observe, agora, os dados inseridos nas tabelas Total_Horas e Qtdade_Func pelo trigger: SELECT * FROM Total_Horas; SELECT * FROM Qtdade_Func;
  299. 299. 58 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  300. 300. 59 Alteração de um Trigger • Um trigger não pode ser alterado diretamente • Para alterá-lo, deve-se recriá-lo com o comando CREATE OR REPLACE TRIGGER • Se esse trigger teve privilégios concedidos para outros usuários, eles permanecem válidos enquanto o trigger existir (mesmo que ele tenha sido recriado)
  301. 301. 60 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  302. 302. Ativação/Desativação de um Trigger • Quando um trigger é criado, ele fica automaticamente ativo • Para desativar a execução do trigger, deve-se utilizar o comando ALTER TRIGGER com a cláusula DISABLE e para reativá-lo, a cláusula ENABLE • Sintaxe: 61 ALTER TRIGGER nome_trigger DISABLE/ENABLE;
  303. 303. 62 Roteiro da Apresentação • Trigger • CREATE TRIGGER • Alteração de um trigger • Ativação/Desativação de um trigger • Exclusão de um trigger
  304. 304. 63 Exclusão de um Trigger • Para excluir um trigger, deve ser usado o comando DROP TRIGGER nome_do_trigger; • Esse comando remove a estrutura do trigger e retira os privilégios concedidos a outros usuários
  305. 305. 64 Exclusão de um Trigger • Para visualizar os triggers criados por um usuário, use a visão user_triggers do dicionário de dados SELECT TRIGGER_NAME FROM user_triggers; SELECT TRIGGER_NAME, TRIGGER_BODY FROM user_triggers;
  306. 306. 65 SELECT
  307. 307. 66 Bibliografia • FANDERUFF, D. Dominando o Oracle 9i: Modelagem e Desenvolvimento. São Paulo: Pearson Education do Brasil, 2003. • RAMALHO, J. A. Oracle 9i. São Paulo: Berkeley Brasil, 2002
  308. 308. Obrigado Profa. Elisângela Botelho Gracias elisangela.botelho@mackenzie.br 67
  309. 309. Universidade Presbiteriana MMaacckkeennzziiee BBaannccoo ddee DDaaddooss CCCCuuuurrrrssssoooorrrr -- CCCCoooonnnnttttrrrroooolllleeee ddddeeee PPPPrrrroooocccceeeessssssssaaaammmmeeeennnnttttoooo JJaammiillssoonn BBiissppoo ddooss SSaannttooss Faculdade de Computação e Informática São Paulo, 01 de fevereiro de 2011
  310. 310. Controle de Processamento • Introdução • Cursor explicito • Cursor implícito Controle de Processamento 2
  311. 311. Introdução • Oracle aloca uma área de memória conhecida como área de contexto para processar uma instrução SQL • Cursor é um handle ou uumm ppoonntteeiirroo ppaarraa aa área de contexto • Com o cursor um programa PL/SQL pode controlar a área de contexto Controle de Processamento 3
  312. 312. Introdução • TIPOS DE CURSORES – Explícitos –– IImmppllíícciittooss Controle de Processamento 4
  313. 313. Introdução • Oracle usa cursores implícitos para analisar e executar os comandos SQL • Cursores explícitos são declarados explicitamente ppeelloo pprrooggrraammaaddoorr Controle de Processamento 5
  314. 314. Introdução • Usando atributos do cursor SQL, você pode testar o resultado de suas instruções SQL SQL%ROWCOUNT Numero de linhas afetadas pelo ultimo comando SQL SQL%FOUND Boolean que informa se alguma linha foi afetada ultimo comando SQL SQL%NOTFOUND Boolean que informa se nenhuma de linhas afetada pelo ultimo comando SQL SQL%ISOPEN Boolean que informa se o cursor esta aberto Controle de Processamento 6
  315. 315. Introdução SET SERVEROUTPUT ON 4000 CREATE OR REPLACE PROCEDURE Aumento_Salario IS v_linhas_atualizadas VARCHAR2(40); BEGIN UPDATE Funcionarios SET Salario = Salario * 1.1; v_linhas_atualizadas:=(SQL%ROWCOUNT||' linhas atualizadas '); dbms_output.put_line(v_linhas_atualizadas); END Aumento_Salario; EXEC Aumento_Salario; Controle de Processamento 7
  316. 316. Cursor Explicito • Consulta que retornam nenhum ou mais de uma linha • Cursor deve ser declarado explicitamente na áárreeaa ddee ddeeccllaarraaççõõeess • Não pode ter o mesmo nome da tabela Controle de Processamento 8
  317. 317. Cursor Explicito • PROCESSAMENTO DE CURSOR EXPLICITO – Declarar o cursor – Abrir o cursor – Buscar os resultados nas vvaarriiáávveeiiss ddee PPLL//SSQQLL – Processar a(s) linha (s) – Fechar o cursor Controle de Processamento 9
  318. 318. Cursor Explicito • FUNCIONAMENTO DO CURSOR Teste fim dados Declare Open Fetch Close Controle de Processamento 10 Cria uma SQL área Identifica o grupo de dados Acessa cada linha Testa fim de linhas existentes Libera o grupo de dados
  319. 319. Cursor Explicito • DECLARANDO O CURSOR CURSOR <nome do cursor> is <comando select> – Não incluir a clausula INTO no select Controle de Processamento 11
  320. 320. Cursor Explicito DECLARE CURSOR funcionario_cursor IS SELECT nome_func, salario FROM Funcionarios; CURSOR funcionario_cursor_01 IS SELECT * FROM Funcionarios; BEGIN Controle de Processamento 12
  321. 321. Cursor Explicito • ABRINDO O CURSOR OPEN <nome do cursor>; – Abrir o cursor para executar o select – Caso não retorne linha, nenhum exceção será informada – Utilizar os atributos do cursor depois do Fetch Controle de Processamento 13
  322. 322. Cursor Explicito • Buscando dados do Cursor FETCH <nome do cursor> INTO variavel1, variavel2 ,.. | <nome registro> – Recupera os valores da linha corrente – Teste se o cursor contem linhas – Nome do registro pode ser recuperado utilizando %ROWTYPE Controle de Processamento
  323. 323. Cursor Explicito set serveroutput on DECLARE v_cod_func Funcionarios.cod_func%TYPE; v_nome_func Funcionarios.nome_func%TYPE; v_salario Funcionarios.salario% TYPE; CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; BEGIN OPEN funcionario_cursor; FOR i IN 1..2 LOOP FETCH funcionario_cursor INTO v_cod_func, v_nome_func, v_salario; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| v_nome_func||' '|| v_salario); Controle de Processamento 15 END LOOP; END;
  324. 324. Cursor Explicito • Buscando dados do Cursor FETCH <nome do cursor> INTO variavel1, variavel2 ,.. || <<nnoommee rreeggiissttrroo>> EXIT WHEN <condição>; Controle de Processamento
  325. 325. Cursor Explicito set serveroutput on DECLARE v_cod_func Funcionarios.cod_func%TYPE; v_nome_func Funcionarios.nome_func%TYPE; v_salario Funcionarios.salario% TYPE; CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; BEGIN OPEN funcionario_cursor; LOOP FETCH funcionario_cursor INTO v_cod_func, v_nome_func, v_salario; EXIT WHEN funcionario_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| v_nome_func||' '|| v_salario); Controle de Processamento 17 END LOOP; END;
  326. 326. Cursor Explicito • Usando atributos do cursor explicito, você pode testar o resultado de suas instruções SQL %ROWCOUNT Numero de linhas afetadas pelo ultimo comando SQL %FOUND Boolean que informa se alguma linha foi afetada ultimo comando SQL %NOTFOUND Boolean que informa se nenhuma de linhas afetada pelo ultimo comando SQL %ISOPEN Boolean que informa se o cursor esta aberto Controle de Processamento 18
  327. 327. Cursor Explicito • Uso do atributo %ISOPEN – Verificar se o cursor esta aberto antes de executar o FETCH – Se o cursor não o estiver aabbeerrttoo oo FFEETTCCHH nnããoo funciona Controle de Processamento
  328. 328. Cursor Explicito set serveroutput on DECLARE v_cod_func Funcionarios.cod_func%TYPE; v_nome_func Funcionarios.nome_func%TYPE; v_salario Funcionarios.salario% TYPE; CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; BEGIN IF NOT funcionario_cursor%ISOPEN THEN OPEN funcionario_cursor; END IF; LOOP FETCH funcionario_cursor INTO v_cod_func, v_nome_func, v_salario; EXIT WHEN funcionario_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_cod_func)||' '|| v_nome_func||' '|| v_salario); Controle de Processamento 20 END LOOP; END;
  329. 329. Cursor Explicito • Registro e cursor set serveroutput on DECLARE CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; func_registro funcionario_cursor%ROWTYPE; BEGIN IF NOT funcionario_ccuurrssoorr%%IISSOOPPEENN TTHHEENN OPEN funcionario_cursor; END IF; LOOP FETCH funcionario_cursor INTO func_registro; EXIT WHEN funcionario_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(TO_CHAR(func_registro.cod_func)||' '|| func_registro.nome_func||' '|| func_registro.salario); END LOOP; CLOSE funcionario_cursor; END; Controle de Processamento 21
  330. 330. Cursor Explicito • FOR LOOP FOR <nome do registro> IN <nome do cursor> LOOP <comandos> END LOOP; – Registro é declarado implicitamente – Open, fetch e close do cursor realizados implicitamente Controle de Processamento 22
  331. 331. Cursor Explicito set serveroutput on DECLARE CURSOR funcionario_cursor IS SELECT cod_func, nome_func, salario FROM Funcionarios; func_registro funcionario_cursor%ROWTYPE; BEGIN FOR func_registro IN funcionario_ccuurrssoorr LLOOOOPP DBMS_OUTPUT.PUT_LINE(TO_CHAR(func_registro.cod_func)||' '|| func_registro.nome_func||' '|| func_registro.salario); END LOOP; END; Controle de Processamento 23
  332. 332. Cursor Explicito • FECHANDO O CURSOR CLOSE <nome do cursor>; – Fechar o cursor sempre depois de completar o processamento das linhas Controle de Processamento 24
  333. 333. Bibliografia • Oracle 9i Programação PL/SQL – Scott Urman, Ed. Campus • Dominando oo OOrraaccllee 99ii – Damaris Fanderuff, Ed. Pearson Controle de Processamento 25
  334. 334. Obrigado Jamilson BBiissppoo ddooss SSaannttooss jamilson@mackenzie.br 26
  335. 335. Universidade Presbiteriana Mackenzie Package Jamilson Bispo dos Santos Faculdade de Computação e Informática São Paulo, 14 de Novembro de 2009
  336. 336. Tópicos Abordados • Introdução • Criação de Packages • Utilização de Packages • Exclusão de Packages <Título da Aula> 2
  337. 337. Introdução • Conceito Áreas de armazenamento de sub-programa, constantes e variáveis • Composto Especificação Corpo 3
  338. 338. Introdução • Especificação Interface com a aplicação Declaração de tipos de variáveis, constantes, exceções, cursores • Corpo Define cursor e sub programa 4
  339. 339. Introdução 5
  340. 340. Introdução Escopo da Construção Descrição Colocação dentro do pacote Publico Pode ser referenciada a partir de qualquer ambiente de servidor Oracle Declarados dentro da especificação do pacote e pode ser definida dentro do corpo do pacote Privado Pode ser referenciado apenas por outras construções que fazem parte do mesmo pacote Declarada e definida dentro do corpo do pacote 6
  341. 341. Introdução Visibilidade Construção Descrição Local Uma variável definida dentro de um subprograma que não é visível para usuários externos Privado (local para o pacote) variável: você pode definir variável em um corpo do pacote. Estas variáveis podem ser acessadass somente por outros objetos no mesmo pacote. Eles não são visíveis para quaisquer subprogramas ou objetos fora do pacote Global Uma variável ou subprograma que pode ser referenciado (e alterada) fora do pacote e é visível aos usuários externos. Itens globais do pacote devem ser declarados na especificação do pacote. 7
  342. 342. Introdução Restrições • Não chamar um pacote dentro de outro pacote; • Pacote não pode receber parâmetros, somente as rotinas declaradas; • Variáveis Bind não pode ser utilizada por pacotes; • Não utilizar variáveis definidas dentro do pacote; • Pacote não pode ser chamado diretamente, utilizar script onde utilize as rotinas do pacote. 8
  343. 343. Criação da Especificação do Package CREATE [ OR REPLACE] PACKAGE nome_package IS | AS tipo publico, declaração de itens especificação de subprogramas END nome_package 9

×