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(

                            codigo                    integer          identity,

                            nome                     varchar(100),

                            login                      varchar(10),

                            data_desativaçao     datetime)

 

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(

                                               codigo                    integer          identity,

                                               nome                     varchar(100),

                                               login                      varchar(10),

                                               data_desativacao     datetime,

                                               flg_demitido            char(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!