CHAMAR STORE PROCEDURE DENTRO DE OUTRA

DIOGOMUNARIN 03/09/2009 15:53:02
#321852
Fiz a seguin store procedure no sql 2005 server

ALTER PROCEDURE SP_CLASSIFICACAO
@PERIODO_ID AS BIGINT
AS
BEGIN
DECLARE @VALUNO_ID BIGINT
DECLARE @VALUNO VARCHAR(50)
DECLARE @VSOMA DECIMAL(6,2)
DECLARE @BIMESTRE_ATUAL INT
DECLARE @QTD_DISCIPLINA INT
DECLARE @VMEDIA DECIMAL(6,2)
SELECT @BIMESTRE_ATUAL = (SELECT MAX(BIMESTRE) FROM V_AVALIACOES WHERE PERIODO_ID = @PERIODO_ID AND NOTA IS NOT NULL)
CREATE TABLE #CLASSIFICACAO (ALUNO_ID BIGINT,APELIDO VARCHAR(50),SOMA DECIMAL(10,2),MEDIA DECIMAL(10,2))
DECLARE RSCLASSIFICACAO CURSOR
FOR select FK_ALUNO,APELIDO,TOTAL FROM V_CLASSIFICACAO WHERE FK_PERIODO = @PERIODO_ID ORDER BY APELIDO
OPEN RSCLASSIFICACAO
FETCH NEXT FROM RSCLASSIFICACAO INTO @VALUNO_ID,@VALUNO,@VSOMA
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @QTD_DISCIPLINA = (SELECT COUNT(FK_DISCIPLINA) FROM V_AVALIACOES WHERE PERIODO_ID = @PERIODO_ID AND FK_ALUNO = @VALUNO_ID AND BIMESTRE = @BIMESTRE_ATUAL)
SET @VMEDIA = @VSOMA / @QTD_DISCIPLINA
INSERT INTO #CLASSIFICACAO values (@VALUNO_ID,@VALUNO, @VSOMA,@VMEDIA)
FETCH NEXT FROM RSCLASSIFICACAO INTO @VALUNO_ID,@VALUNO,@VSOMA
END
CLOSE RSCLASSIFICACAO
DEALLOCATE RSCLASSIFICACAO
SELECT * FROM #CLASSIFICACAO
END

Essa store coloca a somas das notas dos alunos de uma serie

eu chamo ele assim EXECUTE SP_CLASSIFICACAO 59(codigo da serie)


Porem to fazendo uma agora para gerar a classificacao do aluno, ja q akela outra so ordena. Eu preciso q essa uma eu carrege os dados dessa store q eu criei, ou seja, chamar ela dentro da que estou fazendo, alguem sabe se tem como?
RCMRO 03/09/2009 16:22:34
#321858
Resposta escolhida
Diogo,

Não olhei com calma a sua procedure mas acredito que possa ser melhorada porém, acertei o LAYOUT e acrescentei algumas linhas de qualidade.
Bem, vamos ao seu caso.... Você pode chamar a sua procedure (no exemplo, chamei de SP_ORDENA) sem problemas, passando ou nao parâmetros (passei @Periodo_id mas nem seria necessário). Os dados que você deve estar querendo são os que você gerou na tabela temporária #CLASSIFICACAO. Essa tabela será vista na sua outra procedure e lá você poderá fazer o UPDATE no campo ORDEM (por exemplo) que quando retornar dela, a temporária estará alimentada.

Não sei se me fiz entender mas, lista a tabela temporária antes de chamar a procedure, faz update nessa procedure do campo ORDEM para um número qualquer e lista novamente a temporária quando voltar. Ai você verá o que quero dizer.

 ALTER PROCEDURE sp_Classificacao
(
@Periodo_id BIGINT
) AS
BEGIN
DECLARE @vAluno_id BIGINT
DECLARE @vAluno VARCHAR(50)
DECLARE @vSoma DECIMAL(6,2)
DECLARE @Bimestre_Atual INT
DECLARE @Qtd_Disciplina INT
DECLARE @vMedia DECIMAL(6,2)

CREATE TABLE #Classificacao
(
Aluno_id BIGINT,
Apelido VARCHAR(50),
Soma DECIMAL(10,2),
Media DECIMAL(10,2),
Ordem INT -- <<<<< NOVO
)

SELECT @Bimestre_Atual = MAX(Bimestre)
FROM v_Avaliacoes
WHERE Periodo_id = @Periodo_id
AND Nota IS NOT NULL

DECLARE rsClassificacao CURSOR
FOR SELECT fk_Aluno, Apelido, Total
FROM v_Classificacao
WHERE fk_Periodo = @Periodo_id
ORDER BY Apelido

OPEN rsClassificacao

FETCH NEXT FROM rsClassificacao
INTO @vAluno_id, @vAluno, @vSoma

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @qtd_Disciplina = COUNT(fk_Disciplina)
FROM v_Avaliacoes
WHERE Periodo_id = @Periodo_id
AND fk_Aluno = @vAluno_id
AND Bimestre = @Bimestre_Atual

SET @vMedia = @vSoma / @qtd_Disciplina

INSERT INTO #Classificacao
(Aluno_id, Apelido, Soma, Media)
VALUES (@vAluno_id, @vAluno, @vSoma, @vMedia)

FETCH NEXT FROM rsClassificacao
INTO @vAluno_id, @vAluno, @vSoma
END
CLOSE rsClassificacao
DEALLOCATE rsClassificacao

EXEC sp_Ordena @Periodo_id -- <<<<< NOVO

SELECT Aluno_id, Apelido, Soma, Media, Ordem
FROM #Classificacao
END
DIOGOMUNARIN 03/09/2009 16:53:48
#321864
Obrigado pela dica qto a formatacao rcmro, assim q sobrar um tempo vou deixar ela mais legivel, mas sabe com eh programador ne, sempre deixa coisas para ultima hora.
Bom consegui resolver o problema, vou postar aki pra glera

ALTER PROCEDURE SP_CLASSIFICACAO
@PERIODO_ID AS BIGINT
AS
BEGIN
DECLARE @VALUNO_ID BIGINT
DECLARE @VALUNO VARCHAR(50)
DECLARE @VSOMA DECIMAL(4,2)
DECLARE @BIMESTRE_ATUAL INT
DECLARE @QTD_DISCIPLINA INT
DECLARE @VMEDIA DECIMAL(4,2)
DECLARE @VULT_NOTA DECIMAL(4,2)
DECLARE @VCLASSIFICACAO INT
SELECT @BIMESTRE_ATUAL = (SELECT MAX(BIMESTRE) FROM V_AVALIACOES WHERE PERIODO_ID = @PERIODO_ID AND NOTA IS NOT NULL)
CREATE TABLE #CLASSIFICACAO (ALUNO_ID BIGINT,APELIDO VARCHAR(50),SOMA DECIMAL(10,2),MEDIA DECIMAL(10,2))
DECLARE RSCLASSIFICACAO CURSOR
for select FK_ALUNO,APELIDO,sum(TOTAL) as TOTAL FROM V_CLASSIFICACAO WHERE FK_PERIODO = @periodo_id group by fk_aluno,apelido,fk_periodo
OPEN RSCLASSIFICACAO
FETCH NEXT FROM RSCLASSIFICACAO INTO @VALUNO_ID,@VALUNO,@VSOMA
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @QTD_DISCIPLINA = (SELECT COUNT(FK_DISCIPLINA) FROM V_AVALIACOES WHERE PERIODO_ID = @PERIODO_ID AND FK_ALUNO = @VALUNO_ID AND BIMESTRE = @BIMESTRE_ATUAL)
SET @VMEDIA = @VSOMA / @QTD_DISCIPLINA
INSERT INTO #CLASSIFICACAO values (@VALUNO_ID,@VALUNO, @VSOMA,@VMEDIA)
FETCH NEXT FROM RSCLASSIFICACAO INTO @VALUNO_ID,@VALUNO,@VSOMA
END
CLOSE RSCLASSIFICACAO
DEALLOCATE RSCLASSIFICACAO
set @VULT_NOTA = 0
SET @VCLASSIFICACAO = 0

CREATE TABLE #classificacao_result (ID_ALUNO BIGINT,NOME VARCHAR(50),TOTAL DECIMAL(10,2),MED DECIMAL(10,2),CLASSIFICACAO INT)
DECLARE cursorA CURSOR
FOR SELECT ALUNO_ID,APELIDO,SOMA,MEDIA FROM #classificacao ORDER BY APELIDO
OPEN cursorA
FETCH NEXT FROM cursorA INTO @VALUNO_ID,@VALUNO,@VSOMA,@VMEDIA
WHILE @@FETCH_STATUS = 0
BEGIN
IF @VULT_NOTA = @VSOMA
SET @VULT_NOTA = @VSOMA
ELSE
SET @VCLASSIFICACAO = @VCLASSIFICACAO + 1
SET @VULT_NOTA = @VSOMA
INSERT INTO #classificacao_result values (@VALUNO_ID, @VALUNO, @VSOMA, @VMEDIA, @VCLASSIFICACAO)
FETCH NEXT FROM cursorA INTO @VALUNO_ID,@VALUNO,@VSOMA,@VMEDIA
END
CLOSE cursorA
DEALLOCATE cursorA
SELECT * FROM #classificacao_result
END
DIOGOMUNARIN 04/09/2009 15:29:22
#321983
Bom blz, a SP ta funcionando, mas sera q tem como eu chamar ela dentro de outra sp e correr os registros ?
RCMRO 04/09/2009 15:35:31
#321984
Como disse antes, pode chamar com EXEC mesmo que a SP que você chamar vai conseguir ler as tabelas temporárias que vc criou.
Veja o exemplo abaixo.:


CREATE PROCEDURE sp_1
AS

SET NOCOUNT ON
CREATE TABLE #Teste
(
Campo01 INT,
Campo02 VARCHAR(15)
)

INSERT INTO #Teste(Campo01, Campo02)
VALUES (1,[ô]Valor 1 - SP_1[ô])
INSERT INTO #Teste(Campo01, Campo02)
VALUES (2,[ô]Valor 2 - SP_1[ô])
INSERT INTO #Teste(Campo01, Campo02)
VALUES (3,[ô]Valor 3 - SP_1[ô])

PRINT [ô]ANTES DE EXECUTAR sp_2[ô]
SELECT * FROM #Teste

EXEC sp_2

PRINT [ô]DEPOIS DE EXECUTAR sp_2[ô]
SELECT * FROM #Teste
DROP TABLE #Teste
GO

CREATE PROCEDURE sp_2
AS

SET NOCOUNT ON

INSERT INTO #Teste(Campo01, Campo02)
VALUES (1,[ô]Valor 4 - SP_2[ô])
INSERT INTO #Teste(Campo01, Campo02)
VALUES (2,[ô]Valor 5 - SP_2[ô])
INSERT INTO #Teste(Campo01, Campo02)
VALUES (3,[ô]Valor 6 - SP_2[ô])
GO
Tópico encerrado , respostas não são mais permitidas