Tópico 9 – Manipulando dados

Subtópico 9.1 – Describe each data manipulation language (DML) statement
Subtópico 9.2 – Insert rows into a table
Subtópico 9.3 – Update rows in a table
Subtópico 9.4 – Delete rows from a table
Subtópico 9.5 – Control transactions

Neste novo post, abordarei assuntos relacionados a manipulação de dados, também conhecido como DML (Data Manipulation Language). Também falarei um pouco sobre o controle de transações.

1) Operações DML

São operações que alteram de alguma forma uma, ou várias tabelas do banco de dados. Essas alterações se restringem ao escopo dos registros apenas. Alterações estruturais das tabelas são chamadas de DDL (Data Definition Language), e não serão abordadas neste post.

Os tipos de DML são:

1.1) INSERT

1.1.1) Conceito

Inserir dados em uma tabela.

1.1.2) Sintaxe

INSERT INTO nome_tabela VALUES ([valores])

ou

INSERT INTO nome_tabela SELECT colunas FROM tabela

1.1.3) Dicas

* No INSERT, os valores a serem inseridos serão comparados com os tipos de dados das colunas, para ver se eles são compativeis e se uma conversão implicita é possível.

* A palavra-chave DEFAULT pode ser usada em UPDATEs e INSERTs para usar o valor default determinado em uma coluna. Ex:

           
INSERT INTO TAB_EMPREGADOS
   VALUES(16, 'TESTE DEFAULT', 3000.50, SYSDATE, NULL, 1100, 2, 1, DEFAULT);

1.2) UPDATE

1.2.1) Conceito

Atualizar dados já existentes em uma tabela

1.2.2) Sintaxe

UPDATE nome_tabela SET <colunas> [WHERE filtro]

OBS1: O WHERE não é obrigatório, mas caso seja omitido, todas as linhas da tabela serão atualizadas.

1.2.3) Dicas

* No UPDATE, pode-se usar expressões nos campos a serem atualizados. Expressões incluem literais, colunas, equações matemáticas e funções SQL.

* Em um UPDATE, não é possível ter uma clausula SELECT no lugar do nome da tabela (Inline View). Ex:

-- o exemplo abaixo irá falhar, pois ele usa um SELECT no 
-- lugar do nome da tabela que será atualizada.

 UPDATE
   (SELECT EMP_ID_EMPREGADO, EMP_NOME_EMPREGADO FROM EMPREGADOS)
   SET EMP_SALARIO = 10000
 WHERE EMP_ID_EMPREGADO = (SELECT EMP_ID_EMPREGADO FROM EMPREGADOS WHERE EMP_SETOR_EMPREGADO IS NULL)

1.3) DELETE

1.3.1) Conceito

Remover uma ou várias linhas de uma tabela

1.3.2) Sintaxe

DELETE [FROM] nome_tabela [WHERE filtro]

1.3.3) Dicas

* No DELETE, é possível omitir a palavra-chave FROM.

* O WHERE não é obrigatório, mas caso omitido, irá remover todas as linhas da tabela.

* No DELETE, não é possível remover determinada coluna de uma linha. O comando DELETE remove uma linha inteira da tabela. Ex:

-- o delete abaixo ira falhar
DELETE EMP_ID_EMPREGADO,
       EMP_SETOR_EMPREGADO
  FROM EMPREGADOS
 WHERE EMP_ID_EMPREGADO >= 100;

1.4) MERGE

1.4.1) Conceito

Update/Insert condicional, onde caso uma condição seja verdadeira, um UPDATE é realizado, senão um INSERT é realizado.

1.4.2) Sintaxe

MERGE INTO tab_destino
USING tab_origem
ON (clausula_comparacao – join entre as tabelas)
WHEN MATCHED THEN UPDATE SET <colunas>
WHEN NOT MATCHED THEN INSERT <colunas tabela destino> VALUES <colunas tabela origem>

1.4.3) Exemplo

 MERGE INTO CERTIFICACAO.TAB_EMPREGADOS_BKP B
         USING CERTIFICACAO.TAB_EMPREGADOS E 
            ON (B.ID_EMP = E.ID_EMP)
            WHEN MATCHED THEN 
               UPDATE SET B.NOME_EMP = 'UPDATE MERGE'
            WHEN NOT MATCHED THEN 
              INSERT (B.ID_EMP, 
                      B.NOME_EMP, 
                      B.SALARIO, 
                      B.DATA_ADMISSAO, 
                      B.ID_DEPARTAMENTO, 
                      B.IDADE, 
                      B.COMISSAO, 
                      B.ID_GERENTE)
              VALUES (E.ID_EMP, 
                      E.NOME_EMP, 
                      E.SALARIO, 
                      E.DATA_ADMISSAO, 
                      E.ID_DEPARTAMENTO, 
                      E.IDADE, 
                      E.COMISSAO, 
                      E.ID_GERENTE)

2) Controle Transacional

Quando se executa uma operação DML, esta só será realmente efetivada no banco de dados, ou desfeita, após a execução de um COMMIT ou ROLLBACK, respectivamente. Quando se executa um INSERT, por exemplo, os dados inseridos estão disponiveis apenas para a sessão que executou o INSERT. Todas as outras sessões não podem ver tal insert. Este apenas estará disponível após a execução de um COMMIT.

Uma transação só é finalizada quando um COMMIT (implicito ou explícito) ou um ROLLBACK (implicito ou explícito) são executados.

Existem 2 tipos de commits:

* Commit Explicitos: Ocorre quando o comando COMMIT é executado.

OBS1: O comando COMMIT WORK (padrão ANSI SQL) é o mesmo que o comando COMMIT (padrão Oracle SQL).

* Commit Implicito: Ocorre automaticamente quando certos eventos na base de dados ocorrem. Esses eventos são:

1 – Imediatamente antes ou após a execução de qualquer comando DDL(CREATE, ALTER, DROP, GRANT ou REVOKE). Caso algum comando DDL falhe antes de ser concluído, qualquer transação pendente será “commitada”. Caso ocorra um erro de sintaxe com algum comando DDL, o COMMIT não é executado.

2 – Saír normalmente de alguma ferramenta ORACLE, como o SQL*Plus ou SQL Developer.

O ROLLBACK é o oposto do COMMIT, desfazendo as alterações realizadas. Quando se executa um DELETE, por exemplo, removendo uma linha de determinada tabela, esta emsma linha ainda existirá nos segmentos de UNDO. Caso o usuário que executou o DELETE, execute o comando ROLLBACK, a linha removida será reconstruída a partir dos segmentos de UNDO até o estado inicial da transação. Estes segmentos ficam armazenados na tablespace de UNDO.

Um ROLLBACK implicito ocorre quando um programa termina de forma anormal.

SAVEPOINTs são marcadores dentro de uma transação que permitem a execução de ROLLBACKs parciais. Sua sintaxe é: ROLLBACK TO nome_savepoint.

Seu conceito é melhor explicado através de um exemplo:

-- primeiro savepoint. estado original da tabela
SAVEPOINT ANTES_UPDATE_01;

--update 01
UPDATE CERTIFICACAO.TAB_EMPREGADOS 
   SET NOME_EMP = 'HANS ARNOLD' 
 WHERE NOME_EMP = 'DIRETOR 01';

--segundo savepoint. apos update de registro
SAVEPOINT ANTES_INSERT_01;

--insert 01
INSERT INTO CERTIFICACAO.TAB_EMPREGADOS VALUES(999888, 'GABRIELLE LINS', 25000, SYSDATE, 4, 35, 30, 669966);

--terceiro savepoint. apos insert de linha
SAVEPOINT ANTES_DELETE_01

--DELETE 01
DELETE CERTIFICACAO.TAB_EMPREGADOS WHERE ID_EMP = 999888

--Ao executar toda sequência acima, caso seja necessário apenas 
--desfazer uma parte da transação, como por exemplo manter o 
--UPDATE 01, mas desfazer o INSERT 01, bastaria eu executar
--o seguinte:

ROLLBACK TO ANTES_INSERT_01;

É isso ai pessoal… até a próxima.

Keep Querying