Galera... Seguinte...

 

Criei uma proc que consulta no dicionário de dados todas as colunas q são do
tipo texto de uma tabela CADASTRO... E em seguida, eu populo uma segunda
tabela com os seguintes dados:

- CODIGO(CODCOL) – Determinado pelo valor de contador

- NOME DA COLUNA(NCOL) – Obtido na consulta(do dicionário de dados) das
colunas do tipo texto da tabela CADASTRO

- COMANDO(QUERY_COL) – Comando de select para obter o MAX(LENGTH(COLUNA)) de
todas as colunas da tabela CADASTRO

- TAMANHO MÁXIMO(MAX_TAM) – Campo onde serão inseridos o MAX(LENGTH(COLUNA))
das colunas texto da tabela CADASTRO

 

Inseri os comentários para melhorar o entendimento...

 

A proc q eu criei é a seguinte:

 

/*---------------------------------------------------------------------/*

O QUE A PROC VAI FAZER?                                              

                                                                     

1 LISTAR AS COLUNAS DA TABELA CADASTRO QUE POSSUEM CAMPO COM         

  DATATYPE = TEXTO;                                                  

2 CRIAR UMA TABELA DE 3 COLUNAS: CÓDIGO DA COLUNA(CODCOL) OBTIDO NO  

  CONTADOR, NOME DA COLUNA(NCOL), O COMANDO DO SELECT PARA OBTER O   

  MAX(LENGTH(COLUNA)), E O TAMANHO MÁXIMO INSERIDO EM CADA COLUNA    

  (MAX_TAM).                                                         

3 SERÁ INSERIDO NO CODCOL O VALOR DA SEQUENCIA,                      

  NA NCOL AS COLUNAS QUE POSSUEM DATATYPE TEXTO E NA MAX_TAM O       

  MAX(LENGTH(COLUNA)) PARA CADA LINHA;                               

/*---------------------------------------------------------------------*/

 

CREATE OR REPLACE PROCEDURE PRC_COLUNAS_TEXTO IS

v_ncol            VARCHAR2(50);

v_table           NUMBER(1);

v_max             NUMBER(3);

v_cont            NUMBER(3);

v_ncols           NUMBER(3);

v_fim             EXCEPTION;

v_com             VARCHAR2(200);

 

-- Consulta das colunas que são do tipo texto

   CURSOR C_TEXTO IS

   SELECT COLUMN_NAME

   FROM ALL_TAB_COLUMNS

   WHERE TABLE_NAME = 'CADASTRO' 

   AND   OWNER = 'MATHEUS'

   AND   DATA_TYPE = 'VARCHAR2';

   

BEGIN

/*-----------------------------------------------------/*

A - VERIFICAR SE EXISTE A TABELA T_CAD_COL           

B - SE SIM APAGAR AS INFORMAÇÕES EXISTENTES NA TABELA

C - SE NÃO, SAI DO PROGRAMA                          

/*-----------------------------------------------------*/

-- A   

   SELECT NVL(COUNT(object_name),0)

   INTO v_table

   FROM all_objects

   WHERE object_name = 'T_CAD_COL' 

   AND   object_type = 'TABLE'

   AND   owner = 'MATHEUS';

-- B   

   IF v_table = 1 THEN

      DELETE T_CAD_COL;

-- C   

   ELSIF v_table = 0 THEN

      RAISE v_fim;

   END IF;

   

/*------------------------------------------------------------------/*

D CONTA QUANTAS COLUNAS COM DATATYPE = TEXTO EXISTEM NA TABELA;   

E OBTER COLUNA POR COLUNA DO CURSOR E POPULAR NA TABELA;          

F INSERIR O VALOR DO MAX(LENGTH(COLUNA)) NA TABELA;               

/*------------------------------------------------------------------*/

   

-- D   

   SELECT COUNT(column_name)

   INTO v_ncols

   FROM all_tab_columns

   WHERE table_name = 'CADASTRO'

   AND   data_type = 'VARCHAR2';

   

-- E   

   OPEN C_TEXTO;

      v_cont := 1;

      WHILE v_cont <= v_ncols LOOP

      FETCH C_TEXTO INTO v_ncol;

      INSERT INTO T_CAD_COL (CODCOL, NCOL,QUERY_COL) 

         VALUES (v_cont,v_ncol,

         'SELECT MAX(LENGTH('||v_ncol||')) INTO v_max FROM CADASTRO;');

      v_cont := v_cont + 1;

      EXIT WHEN C_TEXTO%NOTFOUND;

      END LOOP;

   CLOSE C_TEXTO;

   DBMS_OUTPUT.PUT_LINE('FORAM INSERIDAS: '||(v_cont - 1)||' LINHAS!');

   COMMIT;

--F    

   v_cont := 1;

   WHILE v_cont <=  v_ncols LOOP

      SELECT QUERY_COL

      INTO v_com

      FROM T_CAD_COL

      WHERE CODCOL = v_cont;

      EXECUTE IMMEDIATE v_com;

      UPDATE T_CAD_COL SET MAX_TAM = v_max;

      v_cont := v_cont + 1;

   END LOOP;

   DBMS_OUTPUT.PUT_LINE('FORAM ATUALIZADAS: '||(v_cont - 1)||' LINHAS!');

   COMMIT;

   

EXCEPTION

   WHEN v_fim THEN

      DBMS_OUTPUT.PUT_LINE('A TABELA NÃO EXISTE!');

   WHEN OTHERS THEN

      DBMS_OUTPUT.PUT_LINE(SQLERRM);

 

END PRC_COLUNAS_TEXTO;

 

A segunda tabela está criada dessa forma:

CREATE TABLE T_CAD_COL (CODCOL NUMBER(3), NCOL VARCHAR2(30), QUERY_COL
VARCHAR2(200), MAX_TAM NUMBER(3));

 

Está sendo trazido, na execução da proc, o seguinte OUTPUT:

FORAM INSERIDAS: 89 LINHAS! à REFERENTE AO PRIMEIRO DBMS_OUTPUT
ORA-00911: caractere inválido à O ‘X’ DA QUESTÃO!

 

Pessoal, quem puder ajudar, agradeço muito... Estou enviando tb a estrutura
da tab CADASTRO para q vocês possam testar...

 

GRUPO      VARCHAR2(100) Y                         

TIPO       NUMBER(5)     Y                         

CODIGO     VARCHAR2(50)  Y                         

ZONA       VARCHAR2(100) Y                         

NOME       VARCHAR2(100) Y                         

NOMEFANTA  VARCHAR2(100) Y                         

CONTATO    VARCHAR2(100) Y                         

CARGO      VARCHAR2(100) Y                         

ENDERECO   VARCHAR2(100) Y                         

BAIRRO     VARCHAR2(100) Y                         

CIDADE     VARCHAR2(100) Y                         

UF         VARCHAR2(2)   Y                         

PAIS       VARCHAR2(100) Y                         

CEP        VARCHAR2(100) Y                         

SITUACAO   NUMBER(5)     Y                         

DATASITUAC DATE          Y                         

COMENTARIO VARCHAR2(100) Y                         

OBSERVACAO VARCHAR2(100) Y                         

FONE1      VARCHAR2(100) Y                         

FONE2      VARCHAR2(100) Y                         

FONE3      VARCHAR2(100) Y                         

FAX        VARCHAR2(100) Y                         

TELEX      VARCHAR2(100) Y                         

CAIXA_POST VARCHAR2(100) Y                         

CIC_OU_CGC VARCHAR2(100) Y                         

RG_OU_INSC VARCHAR2(100) Y                         

CT_OU_CCM  VARCHAR2(100) Y                         

TIPO_COBRA NUMBER(5)     Y                         

CONT_COBRA VARCHAR2(100) Y                         

BANNUMERO  VARCHAR2(100) Y                         

BANFILIAL  VARCHAR2(100) Y                         

BANAGENCIA VARCHAR2(100) Y                         

IPI_1_PARC VARCHAR2(100) Y                         

ISS_1_PARC VARCHAR2(100) Y                         

ICM_1_PARC VARCHAR2(100) Y                         

CONDICAO   VARCHAR2(100) Y                         

DESCONTO   NUMBER(11,2)  Y                         

ACRESCIMO  NUMBER(11,2)  Y                         

COMISSAO   NUMBER(11,2)  Y                         

REPRESENTA VARCHAR2(100) Y                         

CIF_FOB    NUMBER(5)     Y                         

TRANSPORTA VARCHAR2(100) Y                         

AUX_CONTAA VARCHAR2(100) Y                         

AUX_CONTAB VARCHAR2(100) Y                         

END_COBRAN VARCHAR2(100) Y                         

BAI_COBRAN VARCHAR2(100) Y                         

CID_COBRAN VARCHAR2(100) Y                         

EST_COBRAN VARCHAR2(2)   Y                         

CEP_COBRAN VARCHAR2(100) Y                         

CLI_COBRAN VARCHAR2(100) Y                         

TEMOUTCOB  VARCHAR2(100) Y                         

COB_CLIENT VARCHAR2(100) Y                         

ZONAENTREG VARCHAR2(100) Y                         

END_ENTREG VARCHAR2(100) Y                         

BAI_ENTREG VARCHAR2(100) Y                         

CID_ENTREG VARCHAR2(100) Y                         

EST_ENTREG VARCHAR2(2)   Y                         

CEP_ENTREG VARCHAR2(100) Y                         

CGC_ENTREG VARCHAR2(100) Y                         

INS_ENTREG VARCHAR2(100) Y                         

TEMOUTENT  VARCHAR2(100) Y                         

CLI_ENTREG VARCHAR2(100) Y                         

ENT_CLIENT VARCHAR2(100) Y                         

CADASTRO   DATE          Y                         

FUNDACAO   VARCHAR2(100) Y                         

SUFRAMA    VARCHAR2(100) Y                         

JUNTA      VARCHAR2(100) Y                         

ATIVIDADE  VARCHAR2(100) Y                         

TABELAESTO NUMBER(5)     Y                         

CENTRO     VARCHAR2(100) Y                         

MOEDA      NUMBER(5)     Y                         

CONTRIBUIN NUMBER(5)     Y                         

TEM_AR     VARCHAR2(100) Y                         

TEM_MAR    VARCHAR2(100) Y                         

TEM_TER    VARCHAR2(100) Y                         

TEMPO_AR   NUMBER(5)     Y                         

TEMPO_MAR  NUMBER(5)     Y                         

TEMPO_TER  NUMBER(5)     Y                         

BLOQUEIA   VARCHAR2(100) Y                         

CODESPECIF VARCHAR2(100) Y                         

EMP_FILIAL VARCHAR2(100) Y                         

CLIFOR     VARCHAR2(100) Y                         

DEPTO      VARCHAR2(100) Y                         

NOMEBANCO  VARCHAR2(100) Y                         

CAMARACOMP VARCHAR2(100) Y                         

DIG_CONTA  VARCHAR2(100) Y                         

DIG_AGENC  VARCHAR2(100) Y                         

M_DIRETA   VARCHAR2(100) Y                         

AJUSTE_1   VARCHAR2(100) Y                         

AJUSTE_2   VARCHAR2(100) Y                         

AJUSTE_3   VARCHAR2(100) Y                         

FAX2       VARCHAR2(100) Y                         

FAX3       VARCHAR2(100) Y                         

EMAIL      VARCHAR2(100) Y                         

RAMAL1     VARCHAR2(100) Y                         

RAMAL2     VARCHAR2(100) Y                         

RAMAL3     VARCHAR2(100) Y                         

AJUSTE_N_1 VARCHAR2(100) Y                         

AJUSTE_N_2 VARCHAR2(100) Y                         

AJUSTE_N_3 VARCHAR2(100) Y                         

VENC_CGC   VARCHAR2(100) Y                         

GRUPO_CLFO VARCHAR2(100) Y                         

DATE_TIME  VARCHAR2(100) Y                         

SERASA     VARCHAR2(100) Y

 

Abraços!

 

Matheus Malta



[As partes desta mensagem que não continham texto foram removidas]

Responder a