Truncando uma partição da tabela

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

Pessoal, o meu objetivo é truncar uma partição de acordo com uma data informada.


ex: tenho a seguinte tabela particionada:

Selecionar tudo

 CREATE TABLE tb_contract 
   (	"CD_NR" VARCHAR2(5 BYTE), 
	"DT_INS" DATE, 
	"BRN_CD" VARCHAR2(3 BYTE), 
	"CONTRACT_NO" VARCHAR2(16 BYTE), 
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TBS_1" 
  PARTITION BY RANGE ("DT_INS") INTERVAL (NUMTODSINTERVAL(1,'DAY')) 
  SUBPARTITION BY LIST ("BRN_CD") 
  SUBPARTITION TEMPLATE ( 
    SUBPARTITION "SUBPART_1" VALUES ( 'A' ), 
    SUBPARTITION "SUBPART_2" VALUES ( 'B' ), 
    SUBPARTITION "SUBPART_3" VALUES ( 'C' ), 
    SUBPARTITION "SUBPART_4" VALUES ( 'D' )) 
 (PARTITION "BEFORE_AUG_2014"  VALUES LESS THAN (TO_DATE(' 2014-07-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TBS_1" 
 ( SUBPARTITION "BEFORE_2014_SUBPART_1"  VALUES ('A') 
  TABLESPACE "TBS_FLXSTG" 
 NOCOMPRESS , 
  SUBPARTITION "BEFORE_2014_SUBPART_2"  VALUES ('B') 
  TABLESPACE "TBS_1" 
 NOCOMPRESS , 
  SUBPARTITION "BEFORE_2014_SUBPART_3"  VALUES ('C') 
  TABLESPACE "TBS_1" 
 NOCOMPRESS , 
  SUBPARTITION "BEFORE_2014_SUBPART_4"  VALUES ('D') 
  TABLESPACE "TBS_1" 
 NOCOMPRESS ) ;
Eu preciso truncar uma partição de acordo com a data(DT_INS) informada.
Para isso eu preciso descobrir a que partição a data(DT_INS) está, pegar o nome desta partição e executar o comando TRUNCATE SUBPARTITION <partition_name>;

O problema é que eu não estou conseguindo pegar o nome da partição desta data(DT_INS) informada como parametro.

Alguém pode me ajudar?



Obrigado!
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

eu encontrei uma forma de resolver.

Eu criei uma tabela chamada PARTITION_NAME e nessa tabela eu armazeno as colunas TABLE_NAME, PARTITION_NAME, HIGH_VALUE da tabela all_tab_partitions.

Depois fiz uma procedure. nesta procedure eu:

1 - Leio a tabela como um cursor all_tab_partitions passando o OWNER e O NOME DA TABELA.
2 - Insert na tabela que criei acima PARTITION_NAME.
3 - Uma variavel chamada highValue, recebe uma string:

Selecionar tudo

           highValue := 'TO_DATE('''||' '|| insertDate ||' 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')';
insertDate é um parametro que a procedure recebe.

Valor armazenado na variavel highValue:

Selecionar tudo

          TO_DATE(' 2014-10-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
4 - Faço o select abaixo:

Selecionar tudo

             select PARTITION_NAME
             into   partitionName
             from flxstg.PARTITION_NAME
             where TABLE_NAME = rec.table_name
                and HIGH_VALUE = highValue;

Aqui é o problema.
O select da NO DATA FOUND.
É por conta do valor da variavel highValue.
O conteúdo desta variável está correto pois eu executei a procedure com DBMS_OUTPUT.PUT_LINE para pegar o conteudo e o conteudo é identico ao conteudo HIGH_VALUE da tabela PARTITION_NAME.
Mas não da certo não.
cleberz
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 107
Registrado em: Ter, 15 Nov 2011 8:42 am

Consegui.
Responder
  • Informação
  • Quem está online

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