Ir para conteúdo

POWERED BY:

Arquivado

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

Tiago Mesquita

Cursor não retorna nada em procedure

Recommended Posts

Então pessoal, fiz uma tabela simples para exemplificar o que ocorre aqui,

considerando a tabela pessoa e que eu desejo criar um cursor de um select * from pessoa... sendo a procedure:

 

set serveroutput on

create or replace procedure testando(n1 number) is

cursor c1 is select * from pessoa;

begin

open c1;

dbms_output.put_line(c1%rowcount);

end;

/

 

exec testando(1);

 

ele retorna 0 (dizendo q não obteve nenhum resultado...)

 

agora, se eu der um simples "select count(*) from pessoa;" ele retorna a quantidade de registros q tem em pessoa q são 4...

 

então, pq to tendo esse problema? algum de vocês também já teve esse problema? o que foi?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta sintaxe até onde saiba não funciona.

 

Tebte fazer um sql para contar antes e outro que trate a query em si.

 

Por que precisa contar antes ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Motta,

 

Então, esse é apenas um exemplo que mostra o meu problema...

ocorre que quando eu crio a tabela e dou os selects normais ela retorna os valores, mas qualquer select que eu dê dentro de uma procedure ela não me retorna nada... que problema é esse?

 

 

o banco é o oracle.

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpa o flood, tentei apagar, mas não achei onde...

a conexão tá estranha hj... enfim, to desesperado pois isso é para um trabalho que preciso apresentar sexta. Já fiz a procedure tudo ok, mas por algum mistéria o select dentro dela não quer pegar absolutamente nada :(!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O flood vem acontecendo mesmo.

 

Já viu se não é problema de permissão ? O mesmo owner roda a query por fora e via SP ?

 

Tente fazer um bloco simples, A

 

DECLARE

BEGIN

FOR R IN (SELECT NOME FROM PESSOA WHERE ROWNUM < 5)

LOOP

DBMS_OUTPUT.PUT_LINE(R.NOME);

END LOOP;

END;

 

Veja se o serveroutput on está ligado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O flood vem acontecendo mesmo.

 

Já viu se não é problema de permissão ? O mesmo owner roda a query por fora e via SP ?

 

Tente fazer um bloco simples, A

 

DECLARE

BEGIN

FOR R IN (SELECT NOME FROM PESSOA WHERE ROWNUM < 5)

LOOP

DBMS_OUTPUT.PUT_LINE(R.NOME);

END LOOP;

END;

 

Veja se o serveroutput on está ligado.

Opa Motta,

 

Então, o código que você passou funcionou bem, ele exibiu os nomes na tabela... mas, pq esse código não funciona:

set serveroutput on
create or replace procedure testando(n1 number) is
cursor c1 is select * from pessoa;
begin
open c1;
dbms_output.put_line(c1%rowcount);
end;
/

exec testando(1);
???

 

Quanto as permissões eu não mexi em nada não, pois to logando como system mesmo (no oracle)...

estou desesperado, pois o trabalho é para sexta e tem mais algumas SPs para fazer, sendo que não estou conseguindo testar o resultado se está funcionando direito ou não por não conseguir pegar os dados no select :(!

 

Abração!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não basta abrir o cursor , tem de dar fecth testar fim do cursor etc.

 

Esta sintaxe dá tanto trabalho que não a uso e nunca lembro dos passos completos.

 

DECLARE

v_jobid employees.job_id%TYPE; -- variable for job_id

v_lastname employees.last_name%TYPE; -- variable for last_name

CURSOR c1 IS SELECT last_name, job_id FROM employees

WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK');

v_employees employees%ROWTYPE; -- record variable for row

CURSOR c2 is SELECT * FROM employees

WHERE REGEXP_LIKE (job_id, '[ACADFIMKSA]_M[ANGR]');

BEGIN

OPEN c1; -- open the cursor before fetching

LOOP

FETCH c1 INTO v_lastname, v_jobid; -- fetches 2 columns into variables

EXIT WHEN c1%NOTFOUND;

DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid );

END LOOP;

CLOSE c1;

DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );

OPEN c2;

LOOP

FETCH c2 INTO v_employees; -- fetches entire row into the v_employees record

EXIT WHEN c2%NOTFOUND;

DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ') ||

v_employees.job_id );

END LOOP;

CLOSE c2;

END;

/

 

fonte : http://download.oracle.com/docs/cd/B19306_....htm#sthref1311

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thiago,

 

Para o seu exemplo de cursor dentro da Procedure, faltou colocar o FETCH para o Oracle lhe retornar os dados. Não adianta apenas abrir o CURSOR, ele irá parar no Parse, tem que fazer o fetch para lhe exibir o que deseja.

 

O motta postou um modo de cursor implicíto com FOR que pode também lhe ajudar.

 

Abraços,

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.