Erro no cursor! PLS-00306

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
dmaranini
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 20 Jun 2008 4:07 pm
Localização: são paulo

Estou criando uma procedure que possui um cursor dois cursores.

esta apresentando esta mensagem

PLS-00225: subprogram or cursor 'A' reference is out of scope


segue a procedure.

Selecionar tudo

create or replace procedure prod7035_002(p_mens		in	out	varchar2)
is

	v_cd_endosso_endossado	number;
	v_dt_emissao_apolice	number;
	v_id_tipo_endosso	number;

cursor	c1 is
	select	a.cd_ramo,
		a.cd_local,
		a.cd_apolice,
		a.cd_endosso,
		a.id_registro
	from	interface_extracao	a
	where	a.id_registro		=	'37'
	and	trunc(a.dt_extracao)	=	trunc(sysdate);

cursor	c2	(
			p_cd_local 	number,
			p_cd_ramo_cober number,
			p_cd_apolice 	number,
			p_cd_endosso  	number
		)	is
	--
	select	c.cd_ramo_cobertura
	from	v_histo_apoli_item_ramo c
	where  	c.cd_ramo		=	p_cd_ramo_cober
	and	c.cd_local		=	p_cd_local
	and	c.cd_apolice		=	p_cd_apolice
	and	nvl(c.cd_endosso,0)	=	nvl(p_cd_endosso,0);
	--
begin
	for	rg1	in	c1	loop
		select 	b.cd_endosso_endossado,
			b.dt_emissao_apolice,
			b.id_tipo_endosso
		into	v_cd_endosso_endossado,
			v_dt_emissao_apolice,
			v_id_tipo_endosso
		from	v_histo_apolice b
		where	b.cd_ramo           	=	a.cd_ramo
		and	b.cd_local	        =	a.cd_local
		and	b.cd_apolice        	=	a.cd_apolice
		and	nvl(b.cd_endosso,0)	=	nvl(a.cd_endosso,0);
	  	--
		for	rg2	in	c2	(	rg1.cd_ramo,
							rg1.cd_local,
							rg1.cd_apolice,
							rg1.cd_endosso,
							rg1.id_registro
						) loop
			insert	into	inter_estatistica_cancelamento	(	cd_ramo,
										cd_local,
										cd_apolice,
										cd_endosso,
										id_registro_plataforma,
										id_tipo_endosso,
										dt_emissao,
										cd_endosso_endossado,
										cd_ramo_cobertura,
										vl_premio
									)
								values	(	rg1.cd_ramo,
										rg1.cd_local,
										rg1.cd_apolice,
										rg1.cd_endosso,
										rg1.id_registro,
										v_id_tipo_endosso,
										v_dt_emissao_apolice,
										v_cd_endosso_endossado,
										p_cd_ramo_cober,
										0
									);

	end loop;
		end loop;
end;



alguém sabe o porque ?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, dá uma olhada no teu segundo cursor.

Ele PEDE 4 parâmetros e, você o abre com 5 parâmetros:

Cursor:

Selecionar tudo

c2   ( 
         p_cd_local    number, 
         p_cd_ramo_cober number, 
         p_cd_apolice    number, 
         p_cd_endosso     number 
      )   is 
Abertura:

Selecionar tudo

 c2   (   rg1.cd_ramo, 
                     rg1.cd_local, 
                     rg1.cd_apolice, 
                     rg1.cd_endosso, 
                     rg1.id_registro 
O id_registro está à mais ou deve ser declarado no cursor, beleza?

Outra coisa, dê uma olhada na ordem dos parâmetros que você está abrindo o cursor, pois pode ter problemas com isso, beleza?

qualquer coisa manda pra gente.
dmaranini
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 20 Jun 2008 4:07 pm
Localização: são paulo

então mas o problema esta no

Selecionar tudo

	for	rg1	in	c1	loop
		select 	b.cd_endosso_endossado,
			b.dt_emissao_apolice,
			b.id_tipo_endosso
		into	v_cd_endosso_endossado,
			v_dt_emissao_apolice,
			v_id_tipo_endosso
		from	v_histo_apolice b
		where	b.cd_ramo           	=[b]	a.cd_ramo[/b]
		and	b.cd_local	        =	a.cd_local
		and	b.cd_apolice        	=	a.cd_apolice
		and	nvl(b.cd_endosso,0)	=	nvl(a.cd_endosso,0);
ele da o erro q eu citei no cursor c1 e joga o foco para o a.cd_ramo que esta em negrito.

tentei adicionar id_registro. P_ID_REGISTRO. e mesmo assim ele continua dando o mesmo erro.

vlw pela atenção ![/b]
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Fala brow, beleza?
Então cara...

Seguinte, tem dois problemas ai, então:
1) Aquele que citei anteriormente;
2) Você deve ter se esquecido de alguma tabela ou, alterar todos os a.alguma_coisa no reg1. Você não tem uma tabela com alias "a".

Dá uma olhadinha nesse ponto e, qualquer coisa, manda pra gente.
dmaranini
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 20 Jun 2008 4:07 pm
Localização: são paulo

Mas eu tenho o a.cd_ramo, tabela com alias na hora que eu abro o cursor.

Selecionar tudo

cursor	c1 is
	select	a.cd_ramo,
		a.cd_local,
		a.cd_apolice,
		a.cd_endosso,
		a.id_registro
	from	interface_extracao	a
	where	a.id_registro		=	'37'
	and	trunc(a.dt_extracao)	=	trunc(sysdate);

eu nunca trabalhei
abrindo
c1
c2

e depois for ...

o for rg1 in c1 não localiza a tabela com alias a ?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, nesse caso, você tem que montar o C1 com parâmetros também, como o C2.
Vou montar um exemplo aqui pra você e já lhe envio.
dmaranini
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 20 Jun 2008 4:07 pm
Localização: são paulo

ahh cara !!

rolou aqui

tipo..

ao invés de eu referenciar o alias a.cd_ramo por exemplo
eu referenciei o cursor rg1.cd_ramo e funcionou !

hehe

vlw pela ajuda !!!
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Blzera.. isso ai mesmo.
Qualquer coisa, conta com a gente.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes