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]