[Ajuda] Procedure com CTE

Firebird

18/10/2013

Boa Tarde,

Estou tentando criar uma proc aonde me retorna um select de uma CTE, porem me retorna apenas uma linha, sei que só irá mesmo retornar uma linha, como eu posso fazer para que me trouxesse todo o select?

Como ficaria minha sintaxe?

Abaixo a proc:

SET TERM ^;
CREATE PROCEDURE ABENDE_CLICK_5(
DATA_INI VARCHAR(7),
DATA_FIM VARCHAR(7))
RETURNS( 
METODO	VARCHAR(20),
SNQC	INTEGER)
AS
BEGIN
	FOR	
		  WITH CLICK5 AS
		  (
		  SELECT MOVTO_CERTIFICACAO.CODIGO_TECNICA AS "METODO", SUM(MOVTO_CERTIFICACAO.SOMA) AS "SNQC"        
			  FROM MOVTO_CERTIFICACAO        
			  WHERE	(MOVTO_CERTIFICACAO.STATUS = 'I1')  AND (MOVTO_CERTIFICACAO.DATA >= :DATA_INI)  AND 
					  (MOVTO_CERTIFICACAO.DATA <= :DATA_FIM )         
			  GROUP BY MOVTO_CERTIFICACAO.CODIGO_TECNICA
		  UNION
		  SELECT MOVTO_CERTIFICACAO.CODIGO_TECNICA AS "METODO", SUM(MOVTO_CERTIFICACAO.SOMA) AS "SNQC"        
			  FROM MOVTO_CERTIFICACAO        
			  WHERE 	(MOVTO_CERTIFICACAO.STATUS = 'I2')  AND (MOVTO_CERTIFICACAO.DATA >= :DATA_INI)  AND 
					  (MOVTO_CERTIFICACAO.DATA <= :DATA_FIM)         
			  GROUP BY MOVTO_CERTIFICACAO.CODIGO_TECNICA
		  UNION
		  SELECT MOVTO_CERTIFICACAO.CODIGO_TECNICA AS "METODO", SUM(MOVTO_CERTIFICACAO.SOMA) AS "SNQC"        
			  FROM MOVTO_CERTIFICACAO        
			  WHERE 	(MOVTO_CERTIFICACAO.STATUS = 'I3')  AND (MOVTO_CERTIFICACAO.DATA >= :DATA_INI)  AND 
					  (MOVTO_CERTIFICACAO.DATA <= :DATA_FIM)         
			  GROUP BY MOVTO_CERTIFICACAO.CODIGO_TECNICA
		  UNION
		  SELECT MOVTO_CERTIFICACAO.CODIGO_TECNICA AS "METODO", SUM(MOVTO_CERTIFICACAO.SOMA) AS "SNQC"        
			  FROM MOVTO_CERTIFICACAO        
			  WHERE 	(MOVTO_CERTIFICACAO.STATUS = 'I4')  AND (MOVTO_CERTIFICACAO.DATA >= :DATA_INI)  AND 
					  (MOVTO_CERTIFICACAO.DATA <= :DATA_FIM)         
		  GROUP BY MOVTO_CERTIFICACAO.CODIGO_TECNICA
		  )
          SELECT
			  METODO, SUM(SNQC) AS "SNQC"
		  FROM CLICK5
			  GROUP BY METODO            
          INTO :METODO, :SNQC
	DO
			BEGIN
            	SUSPEND;
			END
END^
SET TERM ;^



Obrigado!
Israel Souza

Israel Souza

Curtidas 0

Respostas

Alex Lekao

Alex Lekao

18/10/2013

Ola Israel, boa tarde!!!

Nao conheco muito bem procedures, mas se vc retirar da CTE nao resolveria?

Rescreva por exemplo o codigo sem aquele Witch alguma coisa, e veja se funciona.

Espero ter ajudado.

Abraco.

Alex - Lekao
GOSTEI 0
Israel Souza

Israel Souza

18/10/2013

Boa Tarde, Alex!

Na verdade com a CTE esta funcionando, porem traz apenas uma linha, se tirar a CTE já não fica dentro do q eu espero no select.

Obrigado!
GOSTEI 0
Deivison Melo

Deivison Melo

18/10/2013

Compare sua procedure com a procedure abaixo e veja quais as diferenças entre elas!

Essa está correta e trás a quantidade de linhas que estiver de acordo com o campo lateral (parâmetro informado).

SET TERM ^ ;

create or alter procedure SP_RETORNA_TAM_CAMPOS (
    TAB varchar(60))
returns (
    TABELA varchar(31),
    CAMPO varchar(31),
    TAMANHO smallint)
as
BEGIN
  FOR
    SELECT
        B.RDB$RELATION_NAME TABELA,
        B.RDB$FIELD_NAME CAMPO,
        A.RDB$FIELD_LENGTH TAMANHO
    FROM RDB$FIELDS A,
         RDB$RELATION_FIELDS B
    WHERE RDB$RELATION_NAME = :TAB
      AND A.RDB$FIELD_NAME = B.RDB$FIELD_SOURCE
    INTO :TABELA,
         :CAMPO,
         :TAMANHO
  DO
  BEGIN
    SUSPEND;
  END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SP_RETORNA_TAM_CAMPOS TO SYSDBA;


PS. Caso não conseguir, por favor, postar a estrutura de todas as tabelas usadas em sua procedure e o código da sua procedure ou apenas o sql que deseja usar para que possa confeccionar sua procedure.

Abração e bons códigos!!
GOSTEI 0
Alex Lekao

Alex Lekao

18/10/2013

Boa Tarde, Alex!

Na verdade com a CTE esta funcionando, porem traz apenas uma linha, se tirar a CTE já não fica dentro do q eu espero no select.

Obrigado!


Oi Israel, bom dia!!!

Blz,

agora que o Deivison entrou na jogada vc sera melhor assistido.

Abraco.

Alex - Lekao
GOSTEI 0
POSTAR