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!