Dúvida na utilização de objetos-relacionais

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
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 319
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Camaradas,

Estou testando a utilização das funcionalidades dos objetos relacionais em uma rotina que eu tenho que fazer que é a seguinte:

O que conheço por objeto-relacional é funcionalidade atribuida ao banco para criar objetos que possam ser utilizados e aproveitados pelo banco de dados e para auxiliar e criar uma extensão da linguagem estruturada PL/SQL.

No caso que estou analisando existe um job que gera um arquivo diariamente para um codigo correspondente. Ou seja, cada código tem um arquivo diário. Mas por alguma eventualidade esses arquivos não foram gerados. Acontece que agora preciso regerar esses arquivos retroativos, gerando um arquivo para cada dia para cada código.

Eu uma situação "normal" eu poderia criar um cursor que localiza-se na tabela os códigos e seus respectivos dias, depois usaria a estrutura desse cursor para comparar o valor de cada posição do contador e se for diferente gero o arquivo para cada código e dia.

Agora, por favor, me corrijam caso eu esteja errado.

Mas com a utilização do objetos relacionais eu tenho a impressão de poder consistir esses dados em uma estrutura como se fosse uma tabela temporaria dentro da minha sessão e trabalhar esses valores. E neste caso ao invés de fazer a comparação do valor da posição do contador eu imprimiria linha a linha e geraria o arquivo respectivo.

Para isso estou utilizando o seguinte bloco:

Selecionar tudo


DECLARE

  vCONT   BINARY_INTEGER := 1;
  G1      BINARY_INTEGER;
  G2      BINARY_INTEGER;  

  TYPE REG_ARQLOTE IS RECORD (  DATA_EMISSAO DATE
                               ,CODIGO          NUMBER(6) );
                               
 TYPE TABLE_ARQLOTE IS TABLE OF REG_ARQLOTE INDEX BY BINARY_INTEGER;
 G_TB_ARQLOTE TABLE_ARQLOTE;
 --

  PROCEDURE SP_ARQ_LOTE 
    IS P_REG_ARQLOTE REG_ARQLOTE;
  BEGIN
    SELECT  DISTINCT
            TO_CHAR(A30.DATA_EMISSAO,'DDMMYYYY') AS DATA_EMISSAO
           ,A30.CODIGO                              AS CORRETOR
      INTO P_REG_ARQLOTE
      FROM A00000030 A30
     WHERE nvl(CODIGO, 0)                IN (38564,38566,38572,38603,38606,38612,38615,38625,38629,38665,38679)
       AND DATA_EMISSAO         BETWEEN '02/4/2012' 
                                    AND '30/5/2012'
     ORDER BY 1,2;
  END;
                               
BEGIN

  G1 := G_TB_ARQLOTE.FIRST;
  G2 := G_TB_ARQLOTE.LAST;

  FOR vCONT IN G1.FIRST .. G2.LAST
  LOOP
    DBMS_OUTPUT.PUT_LINE('TESTE'); -- LOCAL ONDE SERA EXECUTADA A ROTINA P/ GERAR O ARQUIVO
  END LOOP;

END;

Será que alguém poderia me ajudar?

Grato.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 319
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Senhores,

Eu acho que entendi melhor a utilização dos "TYPES".

Cheguei ao que eu precisava da seguinte maneira:

Selecionar tudo


DECLARE

   vCONT   BINARY_INTEGER;

   TYPE REG_ARQLOTE IS RECORD (  DATA A2000030.DATA%TYPE
                                ,CODIGO          A2000030.CODIGO%TYPE );
                               
  TYPE TABLE_ARQLOTE IS TABLE OF REG_ARQLOTE INDEX BY BINARY_INTEGER;
  G_TB_ARQLOTE TABLE_ARQLOTE;
  -- 
                               
BEGIN
  
  vCONT := 1;
  
  FOR RG_TB_ARQLOTE IN ( SELECT   DISTINCT
                                  A30.DATA AS DATA
                                 ,A30.CODIGO         AS CODIGO
                           FROM A2000030 A30
                          WHERE nvl(CODIGO, 0)               IN (38564,38566,38572,38603,38606,38612,38615,38625,38629,38665,38679)
                            AND DATA         BETWEEN '02/4/2012' 
                                                 AND '30/5/2012'
                          ORDER BY 1,2 )
  LOOP
    G_TB_ARQLOTE(vCONT).DATA   := RG_TB_ARQLOTE.DATA;
    G_TB_ARQLOTE(vCONT).CODIGO := RG_TB_ARQLOTE.CODIGO;    
    
    DBMS_OUTPUT.PUT_LINE('DATA: ' || TO_CHAR(G_TB_ARQLOTE(vCONT).DATA,'DDMMYYYY') || ' - ' || G_TB_ARQLOTE(vCONT).CODIGO);
  END LOOP;

END;

 
Assim eu criei uma TABLE com base na estrutura de um RECORD. Agora caso eu quisesse criar essa TABLE mas com base num RECORD já carregado, digo, com dados para apenas referencia-los no LOOP, ou se eu precisasse
criar uma função que retorne o resultado do RECORD e inpute esses valores no TABLE é possível?

Att.,
Responder
  • Informação
  • Quem está online

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