- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 13 anos, 4 meses atrás por
fsitja.
-
AutorPosts
-
julho 14, 2010 às 8:08 pm #95051
Muca
ParticipanteBoa Tarde Pessoal,
Continuo migrando meu banco atual (firebird) para o Oracle, estou tentando chamar uma função PIPELINED atraves de um LOOP,dentro de uma procedure, porem o valor de retorno da função ( para cada registro) esta sendo NULL, sendo que dentro da função os valores sao gerados corretamente. Vamos ao codigo, esse é um teste inicial que estou fazendo:
— PACOTE —
create or replace
PACKAGE PAC_FUN_PIPELINED
AS
TYPE TESTANDO IS RECORD (CONTADOR NUMBER);
TYPE TESTANDO_TABELA IS TABLE OF TESTANDO;FUNCTION FUN_GERA_NUMEROS(QTD_NUM NUMBER)
RETURN TESTANDO_TABELA PIPELINED;
END PAC_FUN_PIPELINED;— FUNÇÃO —
create or replace
PACKAGE BODY PAC_FUN_PIPELINED AS
FUNCTION FUN_GERA_NUMEROS(QTD_NUM NUMBER)
RETURN TESTANDO_TABELA PIPELINED IS
v_record TESTANDO;
BEGIN
FOR CONT IN 1 .. QTD_NUM LOOP
V_RECORD.CONTADOR := (CONT * CONT);
PIPE ROW(V_RECORD);
END LOOP;RETURN;
END FUN_GERA_NUMEROS;
END PAC_FUN_PIPELINED;— PROCEDURE —
create or replace
PROCEDURE V22_TESTE
(
E_NADA IN NUMBER
) IS
VAR_TESTE NUMBER;BEGIN
VAR_TESTE := 100;FOR FOR_SELECT_1 IN (SELECT CONTADOR INTO VAR_TESTE FROM TABLE (A_OR_NETCONTROL.PAC_FUN_PIPELINED.FUN_GERA_NUMEROS(E_NADA)))
LOOP
dbms_output.put_line(VAR_TESTE);
END LOOP;
END V22_TESTE;ou seja, o valor para VAR_TESTE esta sendo NULL a cada iteração do laço.
O que esta errado??
É isso ae..Obrigado!!!
Muca
julho 14, 2010 às 8:22 pm #95052diegomello
ParticipanteOpa…
Olha só..
Aparentemente, o problema está na sua procedure.
Testa assim.CREATE OR REPLACE PROCEDURE v22_teste(e_nada IN NUMBER) IS
var_teste NUMBER;BEGIN
var_teste := 100;FOR for_select_1 IN (SELECT contador
FROM TABLE(a_or_netcontrol.pac_fun_pipelined.fun_gera_numeros(e_nada)))
LOOP
dbms_output.put_line(for_select_1.contador);
END LOOP;
END v22_teste;
julho 14, 2010 às 8:27 pm #95053Muca
Participante[quote=”diegomello”:1wwb5cs9]Opa…
Olha só..
Aparentemente, o problema está na sua procedure.
Testa assim.CREATE OR REPLACE PROCEDURE v22_teste(e_nada IN NUMBER) IS
var_teste NUMBER;BEGIN
var_teste := 100;FOR for_select_1 IN (SELECT contador
FROM TABLE(a_or_netcontrol.pac_fun_pipelined.fun_gera_numeros(e_nada)))
LOOP
dbms_output.put_line(for_select_1.contador);
END LOOP;
END v22_teste;
[/quote]Valeu Diegomello,
Funcionou sim… então não consigo fazer um SELECT INTO dentro de um FOR LOOP??!?!Acabei fazendo isso em outras procedures prontas, mas como não tinha testado elas pelo fato do banco estar incompleto, não vi problemas, vou altera-las tambem.
Mas é isso… problema resolvido!!
Valeu!!!!
julho 14, 2010 às 8:31 pm #95054diegomello
ParticipanteIsso mesmo!
Quando tu usas FOR LOOP no Oracle, tu declaras uma variável para ser usada como o conteúdo da tua query.
Ex.:
-- Created on 14/7/2010 by DIEGO_MELLO
DECLARE
-- Local variables here
i INTEGER;
BEGIN
-- Test statements here
FOR rs IN (SELECT 1 coluna
FROM dual)
LOOP
dbms_output.put_line(rs.coluna);
END LOOP;END;
julho 14, 2010 às 10:23 pm #95056fsitja
ParticipanteOlá,
Olhando pelo código creio que daria para fazer essa lógica que você está tentando apenas usando um SQL simples, tipo:
select level * level valor
from dual
connect by level <= &contador;
Exemplo de execução:
SQL> select level * level valor
2 from dual
3 connect by level <= 4;VALOR
1 4 9 16
julho 14, 2010 às 10:44 pm #95057diegomello
Participantehahahaha
É verdade!
Me foquei em descobrir o problema e nem li o código direito 😛julho 14, 2010 às 11:55 pm #95058Muca
ParticipanteSrs,
realmente no codigo que eu coloquei a segunda solução funciona melhor, só que esse problema é só um teste mais basico, pra verificar o funcionamento da função retornando uma tabela, o verdadeiro problema é bem mais complexo.De qualquer forma, agradeço as respostas, ajudaram e muito.
Abraço!!
julho 15, 2010 às 6:21 am #95065fsitja
ParticipanteSem problemas 😉
Importante é que está resolvido.
-
AutorPosts
- Você deve fazer login para responder a este tópico.
Compartilhe ! Além de ajudar, é legal ! :)
- Clique para compartilhar no Twitter(abre em nova janela)
- Clique para compartilhar no Facebook(abre em nova janela)
- Clique para compartilhar no LinkedIn(abre em nova janela)
- Clique para compartilhar no Reddit(abre em nova janela)
- Clique para compartilhar no WhatsApp(abre em nova janela)
- Clique para compartilhar no Telegram(abre em nova janela)
- Clique para enviar um link por e-mail para um amigo(abre em nova janela)
- Clique para imprimir(abre em nova janela)