O que são declarações TCL em PL / SQL?
TCL significa Transaction Control Statements. Isso salvará as transações pendentes ou reverterá a transação pendente. Essas instruções desempenham um papel vital porque, a menos que a transação seja salva, as alterações por meio de instruções DML não serão salvas no banco de dados. Abaixo estão as diferentes instruções TCL.
COMPROMETER-SE | Salva todas as transações pendentes |
ROLLBACK | Descartar todas as transações pendentes |
SALVAR PONTO | Cria um ponto na transação até que a reversão possa ser feita mais tarde |
ROLLBACK TO | Descartar todas as transações pendentes até o
|
A transação será concluída nos seguintes cenários.
- Quando qualquer uma das declarações acima é emitida (exceto SAVEPOINT)
- Quando as instruções DDL são emitidas. (DDL são declarações de auto-commit)
- QUANDO as declarações DCL são emitidas. (DCL são declarações de auto-commit)
O que é transação autônoma
No PL / SQL, todas as modificações feitas nos dados serão denominadas como uma transação. Uma transação é considerada concluída quando o salvamento / descarte é aplicado a ela. Se nenhum salvamento / descarte for fornecido, a transação não será considerada como concluída e as modificações feitas nos dados não se tornarão permanentes no servidor.
Independentemente de algumas modificações feitas durante uma sessão, o PL / SQL tratará toda a modificação como uma única transação e salvar / descartar essa transação afeta todas as alterações pendentes naquela sessão. A Transação Autônoma fornece uma funcionalidade ao desenvolvedor na qual permite fazer alterações em uma transação separada e salvar / descartar essa transação específica sem afetar a transação da sessão principal.
- Esta transação autônoma pode ser especificada no nível do subprograma.
- Para fazer qualquer subprograma funcionar em uma transação diferente, a palavra-chave 'PRAGMA AUTONOMOUS_TRANSATION' deve ser fornecida na seção declarativa desse bloco.
- Ele instruirá o compilador a tratar isso como a transação separada e o salvamento / descarte dentro desse bloco não refletirá na transação principal.
- A emissão de COMMIT ou ROLLBACK é obrigatória antes de sair desta transação autônoma para a transação principal porque a qualquer momento apenas uma transação pode estar ativa.
- Assim, depois de fazer uma transação autônoma, precisamos salvá-la e concluir a transação, apenas podemos voltar para a transação principal.
Sintaxe:
DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
- Na sintaxe acima, o bloqueio foi feito como uma transação autônoma.
Exemplo 1 : Neste exemplo, vamos entender como a transação autônoma está funcionando.
DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;dbms_output.put_line('Before Salary of 1001 is'|| l_salary);SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;dbms_output.put_line('Before Salary of 1002 is'|| l_salary);UPDATE empSET salary = salary + 5000WHERE emp_no = 1001;nested_block;ROLLBACK;SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;dbms_output.put_line('After Salary of 1001 is'|| l_salary);SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;dbms_output.put_line('After Salary of 1002 is '|| l_salary);end;
Resultado
Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000
Explicação do código:
- Linha de código 2 : Declarando l_salary como NUMBER.
- Linha de código 3 : Declarando o procedimento nested_block
- Linha de código 4 : tornando o procedimento nested_block como 'AUTONOMOUS_TRANSACTION'.
- Linha de código 7-9: Aumentando o salário do funcionário número 1002 em 15000.
- Linha de código 10: Confirmando a transação.
- Linha de código 13-16: Impressão dos detalhes do salário do funcionário 1001 e 1002 antes das alterações.
- Linha de código 17-19: Aumentando o salário do funcionário número 1001 em 5000.
- Linha de código 20: chamando o procedimento nested_block;
- Linha de código 21: Descartando a transação principal.
- Linha de código 22-25: Impressão dos detalhes do salário do funcionário 1001 e 1002 após as alterações.
- O aumento de salário para o funcionário número 1001 não é refletido porque a transação principal foi descartada. O aumento de salário para o funcionário número 1002 é refletido porque esse bloqueio foi feito como uma transação separada e salvo no final.
- Portanto, independentemente de salvar / descartar na transação principal, as alterações na transação autônoma foram salvas sem afetar as alterações na transação principal.