DO BÁSICO AO AVANÇADO PARA MANIPULAÇÃO E ... TABLE employees ( employee_id NUMBER(6) CONSTRAINT...

Preview:

Citation preview

DO BÁSICO AO AVANÇADO PARA

MANIPULAÇÃO E OTIMIZAÇÃO DE DADOS

Fábio Roberto Octaviano

Utilizando DDL para Gerenciar Tabelas

Após o término do Capítulo:

Categorizar os principais objetos de um BD.

Verificar a estrutura de uma tabela.

Listar os tipos de dados existentes.

Criação de constraints em tempo de criação de tabelas.

Descrever como funcionam os esquemas de objetos.

Objeto Descrição

Tabela Unidade de armazenamento básica.

Composta por linhas.

Visão Representa logicamente um subconjunto

de dados de uma ou mais tabelas.

Sequence Gera valores numéricos.

Índice Aumenta a performance de queries.

Sinônimo Dá nomes alternativos a objetos.

Nomes de tabelas e colunas: ◦ Precisam começar com uma letra.

◦ Tamanho de 1 a 30 caracteres.

◦ Devem conter apenas os caracteres:

◦ A–Z, a–z, 0–9, _, $ e #

◦ Não podem ter o mesmo nome de outro objeto do mesmo usuário.

◦ Não pode ser um nome reservado do Oracle.

◦ Você precisa possuir: Privilégio CREATE_TABLE.

Uma área de storage.

◦ Você especifica: O nome da tabela

Nome da coluna, tipo de dado da coluna e seu tamanho.

CREATE TABLE [schema.]table

(column datatype [DEFAULT expr][, ...]);

◦ Tabelas pertencendo a outros usuários não estão no esquema do seu usuário.

◦ É preciso especificar o nome do dono do obejeto como prefixo.

USERB USERA

SELECT *

FROM userB.employees;

SELECT *

FROM userA.employees;

Especifica o valor padrão de uma coluna durante uma instrução Insert.

Literais, expressões ou funções SQL são válidas.

Outro nome de coluna não é aceito.

O valor default especificado deve ser do mesmo tipo da coluna.

CREATE TABLE hire_dates

(id NUMBER(8),

hire_date DATE DEFAULT SYSDATE);

Table created.

◦ Crie a tabela DEPT: ◦ :

◦ Confirme sua criação:

DESCRIBE dept

CREATE TABLE dept

(deptno NUMBER(2),

dname VARCHAR2(14),

loc VARCHAR2(13),

create_date DATE DEFAULT SYSDATE);

Table created.

Data Type Description

VARCHAR2(size) Dado de caracteres de tamanho variável (1 a 4000)

CHAR(size) Dado de caracteres de tamanho fixo (1 a 2000)

NUMBER(p,s) Dado numérico de tamanho variável, onde p é a precisão (1

a 38) e s a escala (-84 a 127)

DATE Valores de data e hora (01/01/4712 AC a 31/12/9999 DC)

LONG Dado de caracteres de tamanho variável (até 2 Gb)

CLOB Dados de caracteres (up to 4 GB)

RAW and LONG RAW Dado binário (até 2 Gb)

BLOB Dado binário (até 4 GB)

BFILE Dado binário armazenado em arquivo externo (até 4 GB)

ROWID Um sistema numérico base-64 representando o endereço

único de uma linha em sua tabela.

Problemas com LONG:

◦ Uma coluna LONG não é copiada quando uma tabela é criada utilizando subqueries.

◦ Uma coluna LONG não pode ser incluída em GROUP BY ou ORDER BY.

◦ Apenas uma coluna LONG pode ser utilizada por tabela.

◦ Nenhuma constraint pode ser definida sobre uma coluna do tipo LONG.

DICA: Utilize sempre CLOB ao invés de LONG!

É possível utilizar tipos de dados DATETIME.

Tipo de Dado Descrição

TIMESTAMP Data com segundos fracionados

INTERVAL YEAR TO

MONTH

Armazenado como um intervalo de anos e meses

INTERVAL DAY TO

SECOND

Armazenado como um intervalo de dias, horas, minutos e segundos

O tipo de dado INTERVAL YEAR TO MONTH armazena um período de tempo utilizando os campos YEAR e MONTH:

O tipo de dado INTERVAL DAY TO SECOND armazena um período de tempo em termos de dias, horas, minutos e segundos:

INTERVAL YEAR [(year_precision)] TO MONTH

INTERVAL DAY [(day_precision)]

TO SECOND [(fractional_seconds_precision)]

INTERVAL YEAR TO MONTH armazena a diferença entre 2 valores datetime, e sua precisão.

Pode ser interessante em casos como:

Lembrar o valor de uma data que é 120 meses futuros.

Verificar se já se passaram 6 meses de uma data em especial.

A precisão padrão do ano é 2 casas.

INTERVAL YEAR TO MONTH armazena a diferença entre 2 valores datetime, e sua precisão.

INTERVAL ‘123-2' YEAR(3) TO MONTH

Indica um intervalo de 123 anos e 2 meses.

INTERVAL ‘123' YEAR(3)

Indica um intervalo de 123 anos e 0 meses.

INTERVAL ‘300' MONTH(3)

Indica um intervalo de 300 meses.

INTERVAL ‘123' YEAR

ERRO pois a precisão padrão é de 2 casas.

INTERVAL DAY TO SECOND armazena um período de tempo em termo de dias, horas, minutos e segundos.

INTERVAL '4 5:12:10.222' DAY TO SECOND(3)

Indica 4 dias, 5 horas, 12 minutos, 10 segundos e

222 milésimos de um segundo.

INTERVAL '4 5:12' DAY TO MINUTE

Indica 4 dias, 5 horas e 12 minutos.

INTERVAL '400 5' DAY(3) TO HOUR

Indica 400 dias e 5 horas.

INTERVAL '11:12:10.2222222' HOUR TO SECOND(7)

indica 11 horas, 12 minutos e 10.2222222 segundos.

INTERVAL YEAR TO MONTH:

CREATE TABLE time_example2

(loan_duration INTERVAL YEAR (3) TO MONTH);

INSERT INTO time_example2 (loan_duration)

VALUES (INTERVAL '120' MONTH(3));

Imaginando SYSDATE = 26-Sep-2001:

SELECT TO_CHAR( sysdate+loan_duration, 'dd-mon-yyyy')

FROM time_example2;

INTERVAL YEAR TO MONTH:

CREATE TABLE time_example3

(day_duration INTERVAL DAY (3) TO SECOND);

INSERT INTO time_example3 (day_duration)

VALUES (INTERVAL '180' DAY(3));

Imaginando SYSDATE = 26-Sep-2001:

SELECT sysdate + day_duration "Half Year"

FROM time_example3;

O tipo de dado TIMESTAMP é uma extensão do tipo DATE, e armazena informações adicionais de horas, minutos, segundos e frações de segundos.

É utilizado quando a precisão de tempo é importante.

É permitido especificar o “time zone”.

TIMESTAMP[(fractional_seconds_precision)]

TIMESTAMP[(fractional_seconds_precision)]

WITH TIME ZONE

TIMESTAMP[(fractional_seconds_precision)]

WITH LOCAL TIME ZONE

No exemplo, a tabela new_employees é criada com uma coluna start_date do tipo TIMESTAMP:

CREATE TABLE new_employees

(employee_id NUMBER,

first_name VARCHAR2(15),

last_name VARCHAR2(15),

...

start_date TIMESTAMP(7));

SELECT start_date FROM new_employees;

17-JUN-03 12.00.00.000000 AM

TIMESTAMP WITH TIME ZONE é uma variação de TIMESTAMP e inclui a especificação do fuso horário no valor.

O TIME ZONE é a diferença do horário especificado em relação ao UTC (Universal Time Coordinate), também chamado Greenwich.

TIMESTAMP[(fractional_seconds_precision)]

WITH TIME ZONE

Por exemplo,

TIMESTAMP '2003-04-15 8:00:00 -8:00'

é o mesmo que

TIMESTAMP '2003-04-15 11:00:00 -5:00'

Isto é, 8:00 a.m. Pacific Standard Time é o mesmo que 11:00 a.m. Eastern Standard Time.

Isso também pode ser representado por:

TIMESTAMP '2003-04-15 8:00:00 US/Pacific'

O tipo de dado TIMESTAMP WITH LOCAL TIME ZONE é outra variação de TIMESTAMP.

A diferença em relação a TIMESTAMP WITH TIME ZONE é que o fuso horário não é armazenado como parte do dado na coluna.

Considera o TIME ZONE especificado no banco.

É apropriado para aplicações nas quais se deseja exibir datas e horas usando os fusos dos clientes.

TIMESTAMP[(fractional_seconds_precision)]

WITH LOCAL TIME ZONE

Por exemplo: CREATE TABLE time_example (order_date TIMESTAMP WITH LOCAL TIME ZONE); INSERT INTO time_example VALUES('15-JAN-04

09:34:28 AM'); SELECT * FROM time_example; ORDER_DATE ---------------------------- 15-JAN-04 09.34.28.000000 AM

Constraints forçam regras em nível de tabela.

Previnem a deleção de tabelas que possuam tabelas dependentes.

Existem 5 tipos válidos de constraints:

◦ NOT NULL

◦ UNIQUE

◦ PRIMARY KEY

◦ FOREIGN KEY

◦ CHECK

Você pode nomear uma constraint ou o Oracle especifica um nome usando o formato SYS_Cn.

É possível criar uma constraint em:

◦ Tempo de criação de uma tabela.

◦ Após uma tabela ter sido criada.

A constraint pode ser em nível de coluna ou tabela.

É possível verificar as constraints existentes no dicionário de dados.

◦ Sintaxe:

◦ Constraint em nível de Coluna:

◦ Constraint em nível de Tabela:

CREATE TABLE [schema.]table

(column datatype [DEFAULT expr]

[column_constraint],

...

[table_constraint][,...]);

column,...

[CONSTRAINT constraint_name] constraint_type

(column, ...),

column [CONSTRAINT constraint_name] constraint_type,

◦ Constraint em nível de Coluna:

◦ Constraint em nível de Tabela:

CREATE TABLE employees(

employee_id NUMBER(6)

CONSTRAINT emp_emp_id_pk PRIMARY KEY,

first_name VARCHAR2(20),

...);

CREATE TABLE employees(

employee_id NUMBER(6),

first_name VARCHAR2(20),

...

job_id VARCHAR2(10) NOT NULL,

CONSTRAINT emp_emp_id_pk

PRIMARY KEY (EMPLOYEE_ID));

Garante que valores nulos não são permitidos na coluna.

Constraint NOT NULL (Nenhuma linha pode conter um valor nulo para essa coluna)

Falta de constraint NOT NULL (permite valores nulos nas linhas)

Constraint NOT NULL

EMPLOYEES

Constraint UNIQUE

INSERT INTO

Não permitido: já existe!

Permitido

Definida em nível de tabela ou de coluna.

CREATE TABLE employees(

employee_id NUMBER(6),

last_name VARCHAR2(25) NOT NULL,

email VARCHAR2(25),

salary NUMBER(8,2),

commission_pct NUMBER(2,2),

hire_date DATE NOT NULL,

...

CONSTRAINT emp_email_uk UNIQUE(email));

DEPARTMENTS PRIMARY KEY

INSERT INTO Não permitido (valor nulo)

Não permitido (50 já existe)

DEPARTMENTS

EMPLOYEES

FOREIGN

KEY

INSERT INTO Não permitido (9 não existe)

Permitido

PRIMARY

KEY …

CREATE TABLE employees(

employee_id NUMBER(6),

last_name VARCHAR2(25) NOT NULL,

email VARCHAR2(25),

salary NUMBER(8,2),

commission_pct NUMBER(2,2),

hire_date DATE NOT NULL,

...

department_id NUMBER(4),

CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)

REFERENCES departments(department_id),

CONSTRAINT emp_email_uk UNIQUE(email));

Definida em nível de tabela ou de coluna.

◦ FOREIGN KEY: define a coluna na tabela filha.

◦ REFERENCES: identifica a tebela e coluna na tabela pai.

◦ ON DELETE CASCADE: remove as linhas dependentes na tabela filha quando uma linha é removida da tabela pai.

◦ ON DELETE SET NULL: converte valores dependentes na tabela filha em NULL.

◦ ON DELETE RESTRICT/NO ACTION: não permite remover a linha da tabela pai.

◦ Define a condição que cada linha precisa satisfazer.

◦ Expressões não permitidas:

Referências a pseudo-colunas: CURRVAL, NEXTVAL, LEVEL e ROWNUM.

Chamadas às funções SYSDATE, UID, USER e USERENV.

Consultas que se refiram a outros valores em outras linhas.

..., salary NUMBER(2)

CONSTRAINT emp_salary_min

CHECK (salary > 0),...

CREATE TABLE employees

( employee_id NUMBER(6)

CONSTRAINT emp_employee_id PRIMARY KEY

, first_name VARCHAR2(20)

, last_name VARCHAR2(25)

CONSTRAINT emp_last_name_nn NOT NULL

, email VARCHAR2(25)

CONSTRAINT emp_email_nn NOT NULL

CONSTRAINT emp_email_uk UNIQUE

, phone_number VARCHAR2(20)

, hire_date DATE

CONSTRAINT emp_hire_date_nn NOT NULL

, job_id VARCHAR2(10)

CONSTRAINT emp_job_nn NOT NULL

, salary NUMBER(8,2)

CONSTRAINT emp_salary_ck CHECK (salary>0)

, commission_pct NUMBER(2,2)

, manager_id NUMBER(6)

, department_id NUMBER(4)

CONSTRAINT emp_dept_fk REFERENCES

departments (department_id));

UPDATE employees

*

ERROR at line 1:

ORA-02291: integrity constraint (HR.EMP_DEPT_FK)

violated - parent key not found

UPDATE employees

SET department_id = 55

WHERE department_id = 110;

Você não pode apagar uma linha que contenha uma primary key que é usada como uma foreign key em outra tabela.

DELETE FROM departments

WHERE department_id = 60;

DELETE FROM departments

*

ERROR at line 1:

ORA-02292: integrity constraint (HR.EMP_DEPT_FK)

violated - child record found

Cria uma tabela e insere as linhas por meio de subconsulta.

Número de colunas da tabela precisa ser igual ao da subconsulta.

Permite definir colunas com nomes de colunas e valores default.

Somente o tipo de dado e a constraint NOT NULL de uma coluna são passados para a nova tabela.

CREATE TABLE table

[(column, column...)]

AS subquery;

CREATE TABLE dept80

AS

SELECT employee_id, last_name,

salary*12 ANNSAL,

hire_date

FROM employees

WHERE department_id = 80;

Table created.

DESCRIBE dept80

Use o comando ALTER TABLE para:

Adicionar uma nova coluna.

Modificar uma coluna existente.

Definir uma valor default para uma nova coluna.

Eliminar uma coluna.

Use o comando ALTER TABLE para adicionar, modificar ou remover colunas:

ALTER TABLE table

ADD (column datatype [DEFAULT expr]

[, column datatype]...);

ALTER TABLE table

MODIFY (column datatype [DEFAULT expr]

[, column datatype]...);

ALTER TABLE table

DROP (column);

Adicionando uma coluna:

A coluna é inserida sempre no final da tabela:

ALTER TABLE dept80

ADD (job_id VARCHAR2(9));

Table altered.

Modificando uma coluna:

É possível modificar o tipo, tamanho e valor DEFAULT de uma coluna.

Uma alteração no valor DEFAULT da coluna afeta apenas inserções subseqüentes na tabela.

ALTER TABLE dept80

MODIFY (last_name VARCHAR2(30));

Table altered.

Removendo uma coluna:

ALTER TABLE dept80

DROP COLUMN job_id;

Table altered.

A opção SET UNUSED marca uma ou mais colunas como não-utilizável, para remoção futura.

A opção DROP UNUSED COLUMNS remove as colunas marcadas como UNUSED.

ALTER TABLE <table_name>

SET UNUSED(<column_name>);

ALTER TABLE <table_name>

SET UNUSED COLUMN <column_name>;

OR

ALTER TABLE <table_name>

DROP UNUSED COLUMNS;

Todos os dados e estrutura da tabela são apagados.

Quaisquer transações pendentes são commitadas.

Todos os índices são apagados.

Todas as constraints são apagadas.

NÃO é possível fazer rollback do comando DROP TABLE.

A tabela e suas constraints são enviadas à lixeira.

Continua a ocupar espaço no banco de dados.

DROP TABLE dept80;

Table dropped.

Todos os dados e estrutura da tabela são apagados.

Quaisquer transações pendentes são commitadas.

Todos os índices são apagados.

Todas as constraints são apagadas.

NÃO é possível fazer rollback do comando DROP TABLE PURGE.

NÃO envia o objeto para a lixeira e não há mais como recuerá-lo.

Libera a área de armazenamento no banco.

DROP TABLE dept80 PURGE;

Table dropped.

Ferramenta de reparo para modificações acidentais em tabelas:

Restaura uma tabela para um ponto anterior.

Fácil uso, disponibilidade e rápida execução.

Sintaxe:

FLASHBACK TABLE[schema.]table[,

[ schema.]table ]...

TO { TIMESTAMP | SCN } expr

[ { ENABLE | DISABLE } TRIGGERS ];

Exemplo:

DROP TABLE emp2;

Table dropped

FLASHBACK TABLE emp2 TO BEFORE DROP;

Flashback complete

SELECT original_name, operation, droptime,

FROM recyclebin;

Objetivos:

◦ Criação de novas tabelas.

◦ Criação de uma tabela por meio da sintaxe

CREATE TABLE AS.

◦ Verificação da existência de tabelas.

◦ Remoção de tabelas.

1. Crie a tabela DEPT com base na tabela abaixo. Salve o script. Execute o script e confirme que a tabela foi devidamente criada.

Column Name ID NAME

Key Type Primary key

Nulls/Unique

FK Table

FK Column

Data type NUMBER VARCHAR2

Length 7 25

1. Solução:

CREATE TABLE dept

(id NUMBER(7) CONSTRAINT department_id_pk PRIMARY KEY,

name VARCHAR2(25));

DESCRIBE dept

2. Popule a tabela DEPT com dados da tabela DEPARTMENTS. Inclua apenas as colunas necessárias.

INSERT INTO dept

SELECT department_id, department_name

FROM departments;

3. Crie a tabela EMP com base na tabela abaixo. Salve o script e execute-o. Confirme que a tabela foi criada corretamente.

Column Name ID LAST_NAME FIRST_NAME DEPT_ID

Key Type

Nulls/Unique

FK Table DEPT

FK Column ID

Data type NUMBER VARCHAR2 VARCHAR2 NUMBER

Length 7 25 25 7

3. Solução:

CREATE TABLE emp

(id NUMBER(7),

last_name VARCHAR2(25),

first_name VARCHAR2(25),

dept_id NUMBER(7)

CONSTRAINT emp_dept_id_FK REFERENCES dept (id)

);

DESCRIBE emp

4. Crie a tabela EMPLOYEES2 com base na estrutura da tabela EMPLOYEES. Inclua apenas o EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY e DEPT_ID, respectivamente.

CREATE TABLE employees2 AS

SELECT employee_id id, first_name, last_name, salary, department_id dept_id

FROM employees;

5. Apague a tabela EMP.

DROP TABLE emp;

6. Consulte a lixeira e depois recupere a tabela EMP eliminada no exercício 5.

SELECT original_name, operation, droptime

FROM recyclebin;

FLASHBACK TABLE emp TO BEFORE DROP;

DESC emp

7. Apague a tabela EMP de maneira que não possa ser recuperada. Depois, consulte a lixeira para confirmar.

DROP TABLE emp PURGE;

SELECT original_name, operation, droptime

FROM recyclebin;

Recommended