Banco de Dados - Senado ORACLE Ilka Kawashita – [email protected] Material preparado: Ilka Kawashita ORACLE Linguagens SQL e PL/SQL n Procedures; n Packages; n Functions; n Triggers; n Views; n Materialized views; n Jobs e Sequences; n Prof.: Ilka Kawashita [email protected] Linguagem SQL n SQL – Structured Query Language INCITS/ISO/IEC 9075-*-2008 q ISO/IEC 9075-*:2008 q http://www.jcc.com/sql.htm q Prof.: Ilka Kawashita [email protected] Linguagem PL/SQL n n n n Linguagem de comandos 3GL criada para processar comandos SQL. Provê sintaxe específica para esse fim e tem os mesmos typos de dados do SQL. No lado do servidor é armazenado e compilado no banco Oracle e é executado dentro do executável Oracle. Herda automaticamente a robustez, segurança e portabilidade do Banco de dados Oracle. Prof.: Ilka Kawashita [email protected] Transação n n n São unidades lógicas de trabalho, usadas para dividir suas atividades no banco de dados. Sempre tem um início e um fim. Uma transação começa quando um dos seguintes eventos ocorrem: q q Você se conecta ao bd e executa o primeiro comando DML A transação anterior termina e você entra outro comando DML. Prof.: Ilka Kawashita [email protected] Transações n Uma transação termina quando um dos seguintes eventos ocorrem: q q q q q q q Um comando COMMIT ou ROLLBACK é executado; Um comando DDL, como o CREATE TABLE é executado, nesse caso um COMMIT é automaticamente executado; Um comando DCL, como o TABLE é executado, nesse caso um COMMIT é automaticamente executado; Quando você se desconecta do banco de dados; Se você sair normalmente do SQL*Plus usando o comando EXIT, um COMMIT é automaticamente executado; Se SQL*Plus terminar de forma anormal, um ROLLBACK é automaticamente executado; Quando um comando DML não é executado normalmente, um ROLLBACK é automaticamente executado para esse comando DML específico. Prof.: Ilka Kawashita [email protected] Propriedades ACID das Transações n A teoria de banco de dados tem uma definição mais rigorosa de transação e determina que uma transação tem quarto propriedades fundamentais conhecidas como ACID: q Transações atômicas são comitadas ou revertidas (rolled back) como um grupo, e são atômicas, ou seja, todos os comandos SQL contidos na transação são consideradas como uma unidade indivisível. q Transações consistentes asseguram que o banco de dados permanece em um estado consistente, ou seja, que o banco de dados inicia em um estado consistente e passa a outro estado consistente quando a transação acaba. q O isolamento de transações separadas deve garantir que elas sejam executadas sem interferir uma com as outras. q A durabilidade garante que uma vez a transação seja comitada, as alterações no banco de dados são preservadas, mesmo se a máquina em que o software do banco rode dê problemas mais tarde. Prof.: Ilka Kawashita [email protected] Bloqueio de Transações (Locking) n n Uma transação não pode bloquear (lock) uma linha quanto outra transação já obteve o bloqueio dessa mesma linha. A maneira mais fácil de entender bloqueios default é: q q q Bloqueio de Leitura não bloqueia outra Leitura; Bloqueio de Escritura não bloqueia Leituras; Bloqueio de Escritura só bloqueia outra Escritura quando eles tentam modificar a mesma linha. Prof.: Ilka Kawashita [email protected] Níveis de Isolamento das Transações n Leitura fantasma (Phanton Read) q q q q T1 lê um conjunto de linhas retornadas por uma cláusula WHERE específica T2 então insere uma nova linha, que também satisfaz a cláusula WHERE que foi usada na consulta T1 T1 então lê as linhas novamente usando a mesma consulta, mas agora vê a linha adicional que acabou de ser inserida por T2. Essa nova linha é chamada “fantasma” por que para T1 A linha parece ter surgido por mágica. Prof.: Ilka Kawashita [email protected] Níveis de Isolamento das Transações n Leitura não repetíveis (Nonrepeatable reads) q q q T1 lê uma linha, e T2 modifica essa mesma linha no momento em que T1 a lê. T1 então lê a mesma linha novamente e descobre que a linha que foi lida anteriormente está diferente. Isso é conhecido como leitura não repetíveis por que a linha originalmente lida por T! Foi modificada. Prof.: Ilka Kawashita [email protected] Níveis de Isolamento das Transações n Leituras Sujas (Dirty reads) q q q q T1 modifica uma linha, mas não comita a alteração. T2 lê a linha alterada.. T1 então executa um rollback, desfazendo a modificação. Agora a linha que foi lida por T2 não é mais válida (está suja) por que a modificação feita por T1 ainda não comitada quando T2 fez a leitura. Prof.: Ilka Kawashita [email protected] Níveis de Isolamento das Transações n n Para tratar esses problemas potenciais, os bancos de dados implementam vários níveis de isolamento de transações para prevenir que transações concorrentes interfiram umas com as outras. O standard SQL define os seguintes níveis de isolamento de transações, mostrados em ordem crescente de isolamento: q READ UNCOMMITTED Leitura fantasma (Phanton Read), Leituras não repetíveis (Nonrepeatable reads), e Leituras Sujas (Dirty reads) são permitidas. q READ COMMITTED Leitura fantasma (Phanton Read), Leituras não repetíveis (Nonrepeatable reads) são permitidas, mas Leituras Sujas (Dirty reads) não são. q REPEATABLE READ Leitura fantasma (Phanton Read) são permitidas, mas Leituras não repetíveis (Nonrepeatable reads), e Leituras Sujas (Dirty reads) não são. q SERIALIZABLE Leitura fantasma (Phanton Read), Leituras não repetíveis (Nonrepeatable reads), e Leituras Sujas (Dirty reads) não são permitidos Prof.: Ilka Kawashita [email protected] Níveis de Isolamento no Oracle n n n O Oracle suporta os níveis de isolamento de transações READ COMMITTED e SERIALIZABLE. Ele não suporta os níveis de isolamento de transações READ UNCOMMITTED ou REPEATABLE READ. O nível de isolamento de transações default definido pelo standard SQL é o SERIALIZABLE, mas o default usado pelo banco de dados Oracle é o READ COMMITTED, que é aceitável para a maioria das aplicações. Prof.: Ilka Kawashita [email protected] Procedures n n n n n Uma procedure contém um grupo de comandos SQL e PL/SQL. Procedures permitem que a lógica do negócio seja centralizada no banco de dados. Procedures podem ser usadas em qualquer programa que acesse o banco de dados. O comando CREATE PROCEDURE é usa do para criar uma procedure A sintaxe simplificada do comando CREATE PROCEDURE é: Prof.: Ilka Kawashita [email protected] CREATE PROCEDURE CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name [IN | OUT | IN OUT] type [, ...])] {IS | AS} BEGIN procedure_body END procedure_name; SQL> create or replace procedure hello_world 2 as 3 begin 4 dbms_output.put_line('Hello World!'); 5 end; 6 / Procedure created. SQL> SQL> drop procedure hello_world Procedure dropped. Prof.: Ilka Kawashita [email protected] Parâmetros n n n n n IN é o modo default para um parâmetro; Parâmetros IN já têm um valor quando a procedure é executada; O valor de um parâmetro IN não pode ser modificado no corpo da procedure; Os parâmetros OUT são usados para valores que serão definidos no corpo da procedure; Os parâmetros IN OUT podem já ter um valor quando a procedure é chamada, mas seus valores podem ser alterados no corpo da procedure. Prof.: Ilka Kawashita [email protected] Packages/Pacote n n n n n n n Packages encapsulam funcionalidades relacionadas em um pacote. Packages são tipicamente feitas de dois componentes: uma especificação e um corpo. A especificação de um package contém informação sobre o package. A especificação de um package lista as procedures e funções disponíveis Estas estão potencialmente disponíveis para todos os usuários do banco de dados A especificação do package geralmente não contém código. O corpo do package é que contém o código Prof.: Ilka Kawashita [email protected] CREATE OR REPLACE PACKAGE SQL> create or replace package pkg_test1 2 as 3 function getArea (i_rad NUMBER) return NUMBER; 4 procedure p_print (i_str1 VARCHAR2 :='hello', 5 i_str2 VARCHAR2 :='world', 6 i_end VARCHAR2 :='!' ); 7 end; 8 / Package created. Prof.: Ilka Kawashita [email protected] SQL> SQL> create or replace package body pkg_test1 2 as 3 function getArea (i_rad NUMBER)return NUMBER 4 is 5 v_pi NUMBER:=3.14; 6 begin 7 return v_pi * (i_rad ** 2); 8 end; 9 10 procedure p_print(i_str1 VARCHAR2 :='hello', 11 i_str2 VARCHAR2 :='world', 12 i_end VARCHAR2 :='!' ) 13 is 14 begin 15 DBMS_OUTPUT.put_line(i_str1||','||i_str2||i_end); 16 end; 17 end; 18 / Package body created. Prof.: Ilka Kawashita [email protected] Functions/Funções Uma função é parecida com uma procedure, só que sempre retorna um valor. n O comando CREATE FUNCTION é usado para criar uma função, cuja sintaxe simplificada mostrada no próximo slide n Prof.: Ilka Kawashita [email protected] CREATE OR REPLACE FUNCTION CREATE [OR REPLACE] FUNCTION function_na me [(parameter_name [IN | OUT | IN OUT] type [, ...])] RETURN type {IS | AS} BEGIN function_body END function_name; Prof.: Ilka Kawashita [email protected] Parâmetros n Onde: OR REPLACE especifica que a função deve substituir um função, se ela já existir. q type especifica o tipo de parâmetro PL/SQL q n O Corpo da função tem que retornar um valor do tipo PL/SQL especificado na cláusula RETURN. Prof.: Ilka Kawashita [email protected] Triggers n n n n n n Um trigger é um evento dentro do DBMS que pode causar que código seja executado automaticamente. Existem quatro tipos de triggers no banco de dados: Triggers ao nível de tabelas podem iniciar atividade antes ou depois de um evento INSERT, UPDATE, ou DELETE. Triggers no nível de views definem o que pode ser feito com uma view. Triggers no nível do banco de dados podem ser ativados durante o startup ou shutdown de um banco. Triggers no nível de sessão podem ser usados para armazenar informação específica. Prof.: Ilka Kawashita [email protected] Exemplo de Trigger SQL> SQL> create table company( 2 product_id number(4) not null, 3 company_id NUMBER(8) not null, 4 company_short_name varchar2(30) not null, 5 company_long_name varchar2(60) 6 ); SQL> create table product_audit( 2 product_id number(4) not null, 3 num_rows number(8) not null 4 ); Prof.: Ilka Kawashita [email protected] CREATE TRIGGER SQL> CREATE OR REPLACE TRIGGER myTrigger 2 AFTER INSERT ON company 3 FOR EACH ROW 4 BEGIN 5 UPDATE product_audit 6 SET num_rows =num_rows+1 7 WHERE product_id =:NEW.product_id; 8 IF (SQL%NOTFOUND) THEN 9 INSERT INTO product_audit VALUES (:NEW.product_id,1); 10 END IF; 11 END; 12 / Prof.: Ilka Kawashita [email protected] Views n n n n n n n n n Uma view é uma consulta predefinida em uma ou mais tabelas. A recuperação informação de uma view é feita da mesma maneira que a recuperação em uma tabela. Operações DML (delete, insert, update) podem ser executadas nas tabelas base por algumas views. Views não armazenam dados, elas apenas acessam as linhas das tabelas base User_tables, user_sequences, e user_indexes são todas views. Views só permitem que o usuário recupere dados. Views podem esconder as tabelas de base Ao escrever consultas complexas como views, esconde-se a complexidade das mesmas do usuário. A view só permite que o usuário acesse apenas certas linhas das tabelas base. Prof.: Ilka Kawashita [email protected] Views n n n n n n Subsets ou combinação de dados Simplificação Fonte dos dados: base tables ou views Armazenadas nos dicionário de dados Restringir acesso Não armazenam dados em disco Prof.: Ilka Kawashita [email protected] CREATE VIEW CREATE [OR REPLACE] VIEW [{FORCE | NOFORCE}] VIEW view_name [(alias_name[, alias_name...])] AS subquery [WITH {CHECK OPTION | READ ONLY} CONSTRAINT constraint_name]; n Onde: q q OR REPLACE especifica que a view deve substituir uma view já existente, se presente FORCE especifica que a view deve ser criada mesmo que a tabela base não exista Prof.: Ilka Kawashita [email protected] Parâmetros n n n n n n n n n NOFORCE especifica que a view não deve ser criada se a tabela base não existir. NOFORCE é o default. alias_name especifica o nome de um alias (apelido) de uma expressão na subquery. O número de aliases deve ser o mesmo que o número de expresses na subquery. subquery especifica a subquery que recupera dados das tabelas base. Se aliases forem criados, eles podem ser usados na lista depois da cláusula SELECT. WITH CHECK OPTION especifica que apenas as linhas que serão recuperadas pela subquery podem ser inseridas, atualizadas ou deletadas Por default, linhas não são checadas para saber se elas são passíveis de serem recuperadas pela subquery antes de serem inseridas, atualizadas ou deletadas. constraint_name especifica o nome da constraint WITH CHECK OPTION ou READ ONLY. WITH READ ONLY especifica que linhas só podem lidas das tabelas de base. Prof.: Ilka Kawashita [email protected] Tipos de Views n Existem dois tipos básicos de views: q Views simples que contém uma subquery para recuperar dados de apenas uma tabela base n q Views complexas que contém uma subquery que n n n q Operações DML só podem ser executadas em views simples Recupera dados de várias tabelas base Agrupa linhas usando as cláusulas GROUP BY ou DISTINCT Contém a chamada à uma função Operações DML não podem ser executadas em views complexas Prof.: Ilka Kawashita [email protected] Restrições das Views n Restrições para criar Views que permitem INSERT, UPDATE e DELETE q q q DELETE - GROUP BY, funções de grupo (AVG, COUNT, SUM, etc.), DISTINCT UPDATE – idem DELETE +ROWNUM, colunas com expressão INSERT- idem UPDATE + colunas NOT NULL das base tables não usadas Prof.: Ilka Kawashita [email protected] View Simples SQL> -- display data in the table SQL> select * from Employee 2 / ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION ---- ---------- ---------- --------- --------- ---------- ---------- --------------01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester 8 rows selected. Prof.: Ilka Kawashita [email protected] View Simples SQL> CREATE VIEW my_view AS 2 SELECT * 3 FROM employee 4 WHERE id < 5; View created. SQL> SQL> select * from my_view; ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION ---- ---------- ---------- --------- --------- ---------- ---------- --------------01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager SQL> SQL> drop view my_view; Prof.: Ilka Kawashita [email protected] View dropped. View Complexa SQL> create table courses 2 ( code VARCHAR2(6) 3 , description VARCHAR2(30) 4 , category CHAR(3) 5 , duration NUMBER(2)) ; Table created. SQL> create table course_schedule 2 ( course VARCHAR2(6) 3 , begindate DATE 4 , trainer NUMBER(4) 5 , location VARCHAR2(20)) ; Table created. Prof.: Ilka Kawashita [email protected] View Joining Duas Tabelas SQL> create or replace view crs_course_schedule as 2 select o.course as course_code, c.description, o.begindate 3 from course_schedule o 4 join 5 courses c 6 on (o.course = c.code); View created. SQL> SQL> drop table course_schedule; Table dropped. SQL> SQL> drop table courses; Table dropped. Prof.: Ilka Kawashita [email protected] Materialized Views n Uma view materilizada deve ser vista como: Tipo especial de view que existe fisicamente no banco de dados; q Pode conter joins e/ou funções agregadas; q Foram criadas para melhorar o tempo de execução das consultas pelo cálculo prévio de joins caros e operações de agregação antes da execução; q Usadas nas DWs q Prof.: Ilka Kawashita [email protected] CREATE MATERIALIZED VIEW CREATE MATERIALIZED VIEW costs_mv PCTFREE 0 STORAGE (initial 8k next 8k pctincrease 0) BUILD IMMEDIATE REFRESH FAST ON DEMAND ENABLE QUERY REWRITE AS SELECT time_id, prod_name, SUM ( unit_cost) AS sum_units, COUNT(unit_cost) AS count_units, COUNT(*) AS cnt FROM costs c, products p WHERE c.prod_id = p.prod_id GROUP BY time_id, prod_name; Prof.: Ilka Kawashita [email protected] Sequences Sequence é um item do banco de dados que gera uma sequência de inteiros. n Geralmente usado para popular uma coluna chave primária numérica. n Prof.: Ilka Kawashita [email protected] Criar Sequência CREATE SEQUENCE sequence_name [START WITH start_num] [INCREMENT BY increment_num] [ { MAXVALUE maximum_num | NOMAXVALUE } ] [ { MINVALUE minimum_num | NOMINVALUE } ] [ { CYCLE | NOCYCLE } ] [ { CACHE cache_num | NOCACHE } ] [ { ORDER | NOORDER } ]; SQL> CREATE TABLE test ( 2 record_id NUMBER(18,0), 3 record_text VARCHAR2(10) 4 ); Table created. SQL> SQL> CREATE SEQUENCE test_seq; Prof.: Ilka Kawashita [email protected] Sequência SQL> create sequence deptno_seq start with 50 increment by 10; Sequence created. SQL> SQL> select deptno_seq.nextval, deptno_seq.currval 2 from dual; NEXTVAL CURRVAL ---------- ---------50 50 SQL> SQL> SQL> drop sequence deptno_seq; Sequence dropped. Prof.: Ilka Kawashita [email protected] Jobs n Um conjunto de uma ou mais atividades administrativas que são programadas com o Oracle Enterprise Manager Job System que roda em bancos gerenciados ou outros serviços. Prof.: Ilka Kawashita [email protected] Exemplo JOB SQL> SQL> CREATE TABLE run_table (message VARCHAR2(40)); Table created. SQL> SQL> -- create a procedure to insert rows into the test table: SQL> CREATE OR REPLACE PROCEDURE p_run_insert IS 2 BEGIN 3 INSERT INTO run_table VALUES ('Execution at ' || to_char(sysdate, 'ddmon-yy hh:mi:ss') ) ; 4 COMMIT ; 5 END; 6 / Procedure created. Prof.: Ilka Kawashita [email protected] Exemplo JOB – Cont. SQL> SQL> -- schedule that procedure to run every 10 seconds (approximately): SQL> VARIABLE p_jobno number SQL> BEGIN 2 DBMS_JOB.SUBMIT (:p_jobno,'P_RUN_INSERT;', SYSDATE, 'SYSDATE + (1 0/(24*60*60))'); 3 COMMIT; /* must commit after SUBMIT */ 4 END; 5 / PL/SQL procedure successfully completed. SQL> PRINT p_jobno P_JOBNO ---------122 Prof.: Ilka Kawashita [email protected] Exemplo JOB – Cont. SQL> exec dbms_job.remove(1) BEGIN dbms_job.remove(1); END; * ERROR at line 1: ORA-23421: job number 1 is not a job in the job queue ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86 ORA-06512: at "SYS.DBMS_IJOB", line 529 ORA-06512: at "SYS.DBMS_JOB", line 171 ORA-06512: at line 1 SQL> SQL> drop table run_table; Table dropped. Prof.: Ilka Kawashita [email protected] Referências n Oracle Database 10g SQL, Osborne ORACLE Press Series, McGraw-Hill Osborne Media; 1st edition (20/02/2004), ISBN-13: 978-0072229813 n n http://www.java2s.com/Tutorial/Oracle http://www.oracle.com/technetwork/database/ features/plsql/index.html n http://www.oracle.com/technetwork/database/ focus-areas/bi-datawarehousing/twp-bi-dwmaterialized-views-10gr2--131622.pdf Prof.: Ilka Kawashita [email protected]