Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fabiapo

[Resolvido] Problemas no retorno de stored procedures

Recommended Posts

Boa tarde!

 

Estou com um problema no retorno de uma function que desenvolvi.

 

Primeiro tive que listar todos os registros de uma tabela.

 

Em seguida, dependendo de uma das colunas dos registros retornados, tive que fazer um segundo sql para buscar outros dados em outra tabela. Se o retorno for 1, tenho que buscar mais dados na tabela 1, se o retorno for 2, busco na tabela 2 e assim por diante.

 

Só que no sql de uma destas tabelas ele pode cair numa situação que não pode ser exibida. Assim, eu gostaria de excluir este registro da consulta ou pular para o próximo registro do primeiro sql, mas não consigo. A function me retorna um registro em branco, o que não pode acontecer.

 

Segue um exemplo do meu código:

 

CREATE OR REPLACE FUNCTION funcao_x(...)
RETURNS SETOF record AS
$BODY$
DECLARE 
reg record; 
reg_vi record; 
arg_ac text DEFAULT ''; 
arg_si text;
sql_ac text; 
sql_vi text; 
BEGIN
...

sql_ac:='SELECT A.a, C.c, A.b FROM tabela WHERE ...';

FOR reg IN 
	EXECUTE sql_ac
LOOP
	IF (reg.num!='') THEN
		IF (reg.coluna1='A' OR reg.coluna1='B') THEN
			sql_vi:='SELECT A.a FROM tabela2 WHERE ...';

			EXECUTE sql_vi INTO reg_vi;

			IF (found) THEN		
				/* RETORNA REGISTROS DO SEGUNDO SQL*/
                               ELSE
                                         /* AQUI ESTÁ O PROBLEMA, POIS RETORNA UM REGISTRO EM BRANCO*/
			END IF;
		END IF;
	ELSE
		/*RETORNA REGISTROS DO PRIMEIRO SQL*/
	END IF;				

	RETURN NEXT;
END LOOP;
...

 

Alguém sabe como eu posso chamar o próximo registro do primeiro sql ou pelo menos não deixar o registro em branco ser exibido no retorno?

 

Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

 

Resolvi o problema: A cada vez que se retornam registros para saída, eu coloco o RETURN NEXT, ao invés de inserir esta instrução no final (antes do end loop).

Assim, o registro em branco saiu do meu resultado.

 

Thanks

 

 

Boa tarde!

 

Estou com um problema no retorno de uma function que desenvolvi.

 

Primeiro tive que listar todos os registros de uma tabela.

 

Em seguida, dependendo de uma das colunas dos registros retornados, tive que fazer um segundo sql para buscar outros dados em outra tabela. Se o retorno for 1, tenho que buscar mais dados na tabela 1, se o retorno for 2, busco na tabela 2 e assim por diante.

 

Só que no sql de uma destas tabelas ele pode cair numa situação que não pode ser exibida. Assim, eu gostaria de excluir este registro da consulta ou pular para o próximo registro do primeiro sql, mas não consigo. A function me retorna um registro em branco, o que não pode acontecer.

 

Segue um exemplo do meu código:

 

CREATE OR REPLACE FUNCTION funcao_x(...)
RETURNS SETOF record AS
$BODY$
DECLARE 
reg record; 
reg_vi record; 
arg_ac text DEFAULT ''; 
arg_si text;
sql_ac text; 
sql_vi text; 
BEGIN
...

sql_ac:='SELECT A.a, C.c, A.b FROM tabela WHERE ...';

FOR reg IN 
	EXECUTE sql_ac
LOOP
	IF (reg.num!='') THEN
		IF (reg.coluna1='A' OR reg.coluna1='B') THEN
			sql_vi:='SELECT A.a FROM tabela2 WHERE ...';

			EXECUTE sql_vi INTO reg_vi;

			IF (found) THEN		
				/* RETORNA REGISTROS DO SEGUNDO SQL*/
                               ELSE
                                         /* AQUI ESTÁ O PROBLEMA, POIS RETORNA UM REGISTRO EM BRANCO*/
			END IF;
		END IF;
	ELSE
		/*RETORNA REGISTROS DO PRIMEIRO SQL*/
	END IF;				

	RETURN NEXT;
END LOOP;
...

 

Alguém sabe como eu posso chamar o próximo registro do primeiro sql ou pelo menos não deixar o registro em branco ser exibido no retorno?

 

Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.