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:
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;
Grato.