Tabela Virtual

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
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

e aí trevisolli...primeiro obrigado pela atenção.
seguinte, está dando o seguinte erro:

Selecionar tudo

 existe ORA-06550: linha 20, coluna 5: PL/SQL: SQL Statement ignored ORA-06550: linha 35, coluna 25: PLS-00364: o uso da variável 'X' de índice
eu tirei o insert into, pois não vejo necessário para minha utilização.
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

e aí trevisolli, obrigado pela atenção.
seguinte, está dando o seguinte erro:

Selecionar tudo

existe ORA-06550: linha 20, coluna 5: PL/SQL: SQL Statement ignored ORA-06550: linha 35, coluna 25: PLS-00364: o uso da variável 'X' de índice.
Eu tirei o insert into.
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, coloca o bloco alterado por você aqui, pode ser?
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Alterei pouca coisa...tirei somente o insert..mas está aí. Acho que estamos perto de concluir...ehehehe

Selecionar tudo


DECLARE  

   TYPE rec_protocolo IS RECORD 
      (nu_protocolo tbl_protocolo.nu_protocolo%TYPE, 
       dt_movimento tbl_movimento.dt_movimento%TYPE); 
                              
   TYPE tab_protocolo IS TABLE OF rec_protocolo INDEX BY BINARY_INTEGER;                          

   v_tabela tab_protocolo;  
    
 CURSOR C_DADOS IS -- Retorna data geral 
 
   SELECT MOV.DT_MOVIMENTO DATA_MOV 
     FROM TBL_PROTOCOLO PRT, 
          TBL_MOVIMENTO MOV 
    WHERE PRT.CD_PROTOCOLO = MOV.CD_PROTOCOLO; 
    
 CURSOR C_DADOS_T (P_DATA DATE) IS -- Retorna data do grupo que eu quero e comparar com a data geral.
 
             SELECT A.PROTOCOLO, A.DATA_MOVI
               FROM (SELECT MAX(MOV.DT_MOVIMENTO) DATA_MOVI, PRT.NU_PROTOCOLO PROTOCOLO 
                      FROM TBL_PROTOCOLO PRT, 
                           TBL_MOVIMENTO MOV 
                     WHERE PRT.CD_PROTOCOLO = MOV.CD_PROTOCOLO 
                       AND MOV.DT_MOVIMENTO > TO_DATE('01/01/2007 00:00:00','DD/MM/YYYY HH24:MI:SS') 
                       AND MOV.CD_SETOR_DEST IN (670,671,672,1611,1723,1882,1883,2672,2990) 
                  GROUP BY PRT.NU_PROTOCOLO 
                  ORDER BY PRT.NU_PROTOCOLO) A 
             WHERE A.DATA_MOV > P_DATA; 
BEGIN 

  FOR x IN c_dados LOOP 

     -- Aqui, populo o type (tabela tab_protocolo, pela variável v_tabela) 
     FOR z IN c_dados_t(x.data_mov) LOOP 
       v_tabela(c_dados_t%ROWCOUNT).nu_protocolo := z.protocolo; 
       v_tabela(c_dados_t%ROWCOUNT).dt_movimento := z.data_movi; 
     END LOOP; 
  
  END LOOP; 
  
  -- com o type populado... posso utilizá-lo, da forma que desejar... 
  -- vou dar uma mensagem (dbms_output). 
  
  FOR y IN 1..v_tabela.COUNT LOOP 
  
      dbms_output.put_line('Nº Protocolo:      ' || v_tabela(y).nu_protocolo ); 
      dbms_output.put_line('Data Movimentação: ' || v_tabela(y).dt_movimento );  
       
  END LOOP; 

EXCEPTION 
  WHEN OTHERS THEN 
    raise_application_error (-20001, 'Erro no processo de montagem de types: ' || SQLERRM );  
END;

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

Este aqui não deu erro brother.

Estava dando erro, porque você colocou:

Selecionar tudo

       WHERE a.data_mov > p_data;
E o correto é (data_movI):

Selecionar tudo

       WHERE a.data_movi > p_data;

Selecionar tudo


DECLARE
   TYPE rec_protocolo IS RECORD ( nu_protocolo   tbl_protocolo.nu_protocolo%TYPE,
                                  dt_movimento   tbl_movimento.dt_movimento%TYPE );

   TYPE tab_protocolo IS TABLE OF rec_protocolo INDEX BY BINARY_INTEGER;

   v_tabela   tab_protocolo;

   CURSOR c_dados
   IS                                                    -- Retorna data geral
      SELECT mov.dt_movimento data_mov
        FROM tbl_protocolo prt, tbl_movimento mov
       WHERE prt.cd_protocolo = mov.cd_protocolo;

   CURSOR c_dados_t (p_data DATE)
   IS       -- Retorna data do grupo que eu quero e comparar com a data geral.
      SELECT a.protocolo, a.data_movi
        FROM (SELECT   MAX (mov.dt_movimento) data_movi,
                       prt.nu_protocolo protocolo
                  FROM tbl_protocolo prt, tbl_movimento mov
                 WHERE prt.cd_protocolo = mov.cd_protocolo
                   AND mov.dt_movimento > TO_DATE ('01/01/2007 00:00:00','DD/MM/YYYY HH24:MI:SS')
                   AND mov.cd_setor_dest IN (670, 671, 672, 1611, 1723, 1882, 1883, 2672, 2990)
              GROUP BY prt.nu_protocolo
              ORDER BY prt.nu_protocolo) a
       WHERE a.data_movi > p_data;
BEGIN
   FOR x IN c_dados
   LOOP
-- Aqui, populo o type (tabela tab_protocolo, pela variável v_tabela)
      FOR z IN c_dados_t (x.data_mov)
      LOOP
         v_tabela (c_dados_t%ROWCOUNT).nu_protocolo := z.protocolo;
         v_tabela (c_dados_t%ROWCOUNT).dt_movimento := z.data_movi;
      END LOOP;
   END LOOP;

-- com o type populado... posso utilizá-lo, da forma que desejar...
-- vou dar uma mensagem (dbms_output).
   FOR y IN 1 .. v_tabela.COUNT
   LOOP
      DBMS_OUTPUT.put_line ('Nº Protocolo: ' || v_tabela (y).nu_protocolo);
      DBMS_OUTPUT.put_line ('Data Movimentação: ' || v_tabela (y).dt_movimento
                           );
   END LOOP;
EXCEPTION
   WHEN OTHERS THEN
      raise_application_error (-20001, 'Erro no processo de montagem de types: ' || SQLERRM );
END;
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Meu amigo..então não sei mais o que fazer. Está dando erro o uso da variável X
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Fala trevisolli...você não sabe o que tava pegando, eu não tava colocando o nome do schema na frente das tabelas...ahahahahaha...foi mal, está rodando não terminou ainda. Valeu cara.
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

Verdade brother.
Eu o eliminei aqui para os testes.
Espero que funcione.
Qualquer dúvida, manda ai.
tesmerine
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 26 Set 2016 4:00 pm

Aproveitando o tópico....
na parte do código onde é mencionado "Utilizo o type" é possível ao invés do dbms_output.put_line eu retornar um cursor com todas as informações da pl/sql table.

No ambiente que estou acessando, não posso criar nenhum tipo de objeto para auxilio (type,tabelas,etc)... Consigo retornar um cursor acessando as informações da pl/sql table com essas limitações?

Desde já obrigado!
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia,

Você pode usar :

Selecionar tudo

CREATE OR REPLACE
PROCEDURE get_emp_rs (p_deptno    IN  emp.deptno%TYPE,
                      p_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
  OPEN p_recordset FOR
    SELECT ename,
           empno,
           deptno
    FROM   emp
    WHERE  deptno = p_deptno
    ORDER BY ename;
END GetEmpRS;
/

SET SERVEROUTPUT ON SIZE 1000000
DECLARE
  l_cursor  SYS_REFCURSOR;
  l_ename   emp.ename%TYPE;
  l_empno   emp.empno%TYPE;
  l_deptno  emp.deptno%TYPE;
BEGIN
  get_emp_rs (p_deptno    => 30,
              p_recordset => l_cursor);
            
  LOOP 
    FETCH l_cursor
    INTO  l_ename, l_empno, l_deptno;
    EXIT WHEN l_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(l_ename || ' | ' || l_empno || ' | ' || l_deptno);
  END LOOP;
  CLOSE l_cursor;
END;
/

exemplo de https://oracle-base.com/articles/misc/u ... recordsets

Acho que funciona também assim no sql:

Selecionar tudo

var rc refcursor
execute get_emp_rs(10,:rc)
Responder
  • Informação
  • Quem está online

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