Pular para o conteúdo

Oracle – returning clause

Olá,

Pra que serve a cláusula returning?
Com a cláusula returning é possível retornar as linhas afetadas por operações DML.
Por exemplo, se você fizer um update e logo após precisar retornar as linhas que foram alteradas, é só usar a cláusula returning. Assim não precisa fazer um cursor.
Veja o exemplo abaixo:

Script da tabela:

create table EMPREGADO
(
ID_EMP NUMBER not null,
NOME_EMP VARCHAR2(100) not null,
DATA_ADMISSAO_EMP DATE not null
)

Código PL/SQL.

DECLARE

TYPE rec_emp IS RECORD (id_emp empregado.id_emp%type,
nome_emp empregado.nome_emp%type,
data_admissao_emp empregado.data_admissao_emp%type);

TYPE tb_emp IS TABLE OF rec_emp;

a_emp tb_emp;

marca_err number;
BEGIN
marca_err := '0';
insert into empregado emp values (1, 'Julia', sysdate)
returning emp.id_emp, emp.nome_emp, emp.data_admissao_emp bulk collect into a_emp;

marca_err := '1';
dbms_output.put_line('======= INSERT ========');
for i in a_emp.first..a_emp.last loop
dbms_output.put_line('ID: ' || a_emp(i).id_emp || ' - Nome: ' || a_emp(i).nome_emp || ' - Admissão: ' || a_emp(i).data_admissao_emp);
end loop;

marca_err := '2';
update empregado emp
set emp.nome_emp = upper(emp.nome_emp)
where emp.id_emp in (1,2)
returning emp.id_emp, emp.nome_emp, emp.data_admissao_emp bulk collect into a_emp;

marca_err := '3';
DBMS_OUTPUT.PUT_LINE('======= UPDATE ========');
for i in a_emp.first..a_emp.last loop
dbms_output.put_line('ID: ' || a_emp(i).id_emp || ' - Nome: ' || a_emp(i).nome_emp || ' - Admissão: ' || a_emp(i).data_admissao_emp);
end loop;

marca_err := '4';
delete from empregado emp
returning emp.id_emp, emp.nome_emp, emp.data_admissao_emp bulk collect into a_emp;

marca_err := '5';
DBMS_OUTPUT.PUT_LINE('======= DELETE ========');
for i in a_emp.first..a_emp.last loop
dbms_output.put_line('ID: ' || a_emp(i).id_emp || ' - Nome: ' || a_emp(i).nome_emp || ' - Admissão: ' || a_emp(i).data_admissao_emp);
end loop;

EXCEPTION
WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Erro na execução: ponto erro: ' || marca_err || ' - ' || SQLERRM);

END;

No exemplo acima demonstro a cláusula returning com as 3 operações (Insert, Update e Delete). No caso do insert o retorno será de apenas 1 linha, não precisava usar uma table mas para padronizar eu a usei.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *