Compartilhando dados entre Procedures Aninhadas no SQL Server 2000

Veja neste artigo o compartilhamentode dados entre procedures aninhadas.

Compartilhando dados entre Procedures Aninhadas no SQL Server 2000

por Reydeval Rocha

 

Olá Pessoal!

 

Há certas situações em que se faz necessário acessar um conjunto de resultados, a partir de uma procedure “B’, pertencentes à uma procedure “A”. Nessa suposição a procedure “A” é quem chama a procedure “B”. Vamos lá.

 

Tabelas temporárias

 

Ao criar tabelas temporárias numa procedure todos os triggers ou procedures que forem chamados a partir dela também obterão acesso às tabelas temporárias. Esse comportamento pode ser útil em diversas situações onde se deseja compartilhar dados ou conjuntos de resultados entre duas stored procedures ou entre uma stored procedure e um trigger. Vale ressaltar que não é necessário criar tabelas temporárias globais, que se obtém usando ##NOME_TABELA_TEMPORÁRIA ao invés de #NOME_TABELA_TEMPORÁRIA, para que o comportamento descrito possa ser utilizado.

 

Vamos utilizar um exemplo meramente didático, sem valor real. Criaremos uma procedure que fará uso de uma tabela temporária e em seguida chamará uma segunda procedure. De dentro dessa segunda procedure “enxergaremos” os dados da tabela temporária criada anteriormente e atualizaremos alguns dados nesta. De volta à primeira stored procedure é só acessar os dados da tabela temporária atualizados.

 

Vamos ao exemplo:

 

--Criando uma tabela de usuários

create table tb_usuario(

codigointegeridentity,

nomevarchar(100),

loginvarchar(10),

data_desativaçaodatetime)

 

alter table tb_usuario add constraint pk_usuario primary key (codigo)

go

 

--Populando a tabela de usuários

insert into tb_usuario(nome,login,data_desativacao)

  values ('Paulo','psantos',null)

 

insert into tb_usuario(nome,login,data_desativacao)

  values ('Andre','arocha',null)

 

insert into tb_usuario(nome,login,data_desativacao)

  values ('Ana','apassos',null)

 

insert into tb_usuario(nome,login,data_desativacao)

  values ('Joao','jpereira','03/09/2007')

 

insert into tb_usuario(nome,login,data_desativacao)

  values ('Ricardo','rsouza','01/01/2007')

 

--Procedure up_seta_demissao_funcionarios

create procedure up_seta_demissao_funcionarios

as

update #tmp_usuarios

set flg_demitido = 'S'

  where data_desativacao is not null

 

update #tmp_usuarios

set flg_demitido = 'N'

  where data_desativacao is null

go

 

--Procedure principal, up_retorna_usuarios_demitidos

create procedure up_retorna_usuarios_demitidos

as

--Criando a temporária que conterá os dados dos usuários

create table #tmp_usuarios(

codigointegeridentity,

nomevarchar(100),

loginvarchar(10),

data_desativacaodatetime,

flg_demitidochar(1))  

 

--Populando a temporária de usuários

insert into #tmp_usuarios(nome,login,data_desativacao)

   select nome,login,data_desativação

from tb_usuario

 

 

--Mostando os dados da #tmp_usuarios. Comprove que o campo flg_demitido não está preenchido

select * from #tmp_usuarios

 

--Chamando a procedure para setar a demissão dos funcionários

exec up_seta_demissao_funcionarios

 

--Result Set final da procedure up_retorna_usuarios_demitidos

select nome,

case flg_demitido

when 'S' then 'DEMITIDO'

when 'N' then 'AINDA EM SERVIÇO'

end

   from #tmp_usuarios

 

go

 

Observem que a procedure up_seta_demissao_funcionarios tem acesso normal à tabela temporária #tmp_usuários como se fosse uma tabela temporária definida nesta procedure.

 

Conclusão

 

Apesar do exemplo utilizado ser meramente didático, usando o procedimento demonstrado, é perfeitamente possível compartilhar um conjunto de resultados entre procedures aninhadas ou até mesmo entre triggers e procedures. Aproveitem!

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados