- Este tópico contém 18 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 9 meses atrás por
mpvargas.
-
AutorPosts
-
3 de junho de 2009 às 7:08 pm #87111
mpvargas
ParticipanteCaros Amigos,
Estou tentando criar uma instrução SQL para gerar arquivos .TXT pelo SPOOL do SqlPlus no seguinte lay-out:SPOOL /temp/tabela1.txt
SELECT CAMPO1, CAMPO2, CAMPO3, CAMPO4, CAMPO5
FROM tabela1
SPOOL OFF;Como são muitas tabelas, estou tentando criar um script para fazer de forma automática. Fiz o script abaixo:
Select ‘SELECT ‘ || COLUMN_NAME || ‘, ‘
From DBA_TAB_COLUMNS Where Table_name = ‘Tabela1’
Order by COLUMN_NAME;Resultado:
SELECT CAMPO1,
SELECT CAMPO2,
SELECT CAMPO3,
…Eu não quero que o SELECT se repita e preciso colocar a opção TO_CHAR para quando o campo for numérico.
Obrigado pela ajuda.
3 de junho de 2009 às 7:43 pm #87114eversonpiza
Participantempvargas,
A única forma que conheço de fazer isso é usando SQL Dinâmico.
3 de junho de 2009 às 8:30 pm #87116Leonardo Litz
Participantecara vc vai ter que gerar o select dinamicamente coisa do tipo
declare
v_query varchar2(400);
v_coluna varchar2(4000);
v_tabela varchar2(30) := ‘TABELA_NOME’;
v_user varchar2(30) := user;begin
for dd in (select a.column_name
from all_tab_cols a
where a.table_name = v_tabela
and a.owner = v_user) loopv_coluna := v_coluna||','||dd.column_name;end loop;
v_coluna := substr(v_coluna,2);
dbms_output.put_line(‘select ‘||v_coluna||’ from ‘||v_tabela);
end;
Vlw Leonardo Litz
3 de junho de 2009 às 9:04 pm #87118marlontk
ParticipanteCara quando se esta usando o sqlplus é possivel desabilitar as configurações da sesão utilizando o comando set.
Comandos tipo SET
SET NEWPAGE 0
SET SPACE 0
SET LINESIZE 80
SET PAGESIZE 0
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
no teu caso tu podes utilizarSET Pagesize 0;
3 de junho de 2009 às 9:18 pm #87120mpvargas
ParticipanteLitz,
Eu consegui executar o procedimento, mas como faço para exibir o resultado?
Obrigado.4 de junho de 2009 às 4:26 am #87137Leonardo Litz
Participantecara use o dbms_output.put_line, ou htp.p…
4 de junho de 2009 às 4:07 pm #87141eversonpiza
ParticipanteO problema é que o dbms_)output.put_line tem limitação, se não me engano de 1 milhão de bytes, que se o resultado por muito extenso pode estourar.
Uma sugestão é criar uma tabela temporária, e vai inserido a ‘saída’ nesta tabela, e depois faz um select com spool nela, assim não tem problema de limitação
Atn,
Everson4 de junho de 2009 às 4:59 pm #87143mpvargas
ParticipanteJá tem essa linha no final do procedimento
dbms_output.put_line(‘select ‘||v_coluna||’ from ‘||v_tabela);
Não deveria aparecer o resultado?
O resultado não é grande, pois apontei somente para uma tabela.
4 de junho de 2009 às 5:11 pm #87145eversonpiza
ParticipanteNa verdade esse dbms_output vai jogar o select na tela, não o resultado dele.
Seguindo essa linha de raciocínio vc deveria fazer algo do tipo.
….
spool comandos.sql
dbms_output.put_line(‘select ‘||v_coluna||’ from ‘||v_tabela);
spool off
….@comandos. sql
Desta forma, vai ser gerando um arquivo ‘comandos.sql’ com os selects que vc precisa, é só chama-la, setando as devidas configurações que o colega marlontk citou, que vc terá o resultado esperado.
4 de junho de 2009 às 6:53 pm #87149marlontk
ParticipanteOla mpvargas
Conseguiu resolver o teu problema?
Uma coisa que eu não entendi é se voce quer ver a estrutura ou os dados de todas as tables.
Se voce quer ver a estrutura voce pode utilizar duas views user_tables e user_tab_columns
exemploselect c.table_name tabElA,u.COLUMN_NAME coluna ,u.DATA_TYPE tipo,U.DATA_LENGTH
from user_tables c,
user_tab_columns u
where c.table_name = u.TABLE_NAMEcaso queira os dados ai complica um pouco mais… se for posta que dou uma olhada como fazer.
At+
4 de junho de 2009 às 8:00 pm #87150Leonardo Litz
ParticipanteMarlontk
Tenta assim:
declare
v_query varchar2(400);
v_coluna varchar2(4000);
v_tabela varchar2(30) := ‘ITENS_NOTA’;
v_user varchar2(30) := user;
v_linha dbms_sql.Varchar2_Table;
c number;begin
c := 0;
for dd in (select a.column_name
from all_tab_cols a
where a.table_name = v_tabela
and a.owner = v_user) loopc := c +1;
v_linha(c) := ‘,’||dd.column_name;end loop;
if(v_linha.count > 0)then
v_linha(1) := substr(v_linha(1),2);dbms_output.put_line('select '); for dd in 1..v_linha.count loop dbms_output.put_line(v_linha(dd)); end loop; dbms_output.put_line('from '||v_tabela);end if;
end;
sobre o disseram do tamanho do buffer o dbms_output, vc aumenta ele antes.
Vlw Leonardo Litz
4 de junho de 2009 às 9:14 pm #87151marlontk
ParticipanteLitz
Gerou os comandos certinhos, so para resolver o problema todo colocaria um cursor antes para buscar todos os nomes das tables de um determinado usuario e ai ir mudando valor da tua variavel v_tabela para a tabela que o cursor achou.
Isto apenas para mostrar todas as tabelas de um determinado usuario por exemplo.
Quanto ao limite do DBMS_OUTPUTAcho que o comando é set serveroutput valor;
onde o valor é o tamanho do buffer.4 de junho de 2009 às 10:52 pm #87154Leonardo Litz
ParticipanteIsso mesmo cara.
Só não esqueca de zerar a variavel c a cada passagem do loop superior.Vlw Leonardo Litz
4 de junho de 2009 às 11:06 pm #87158mpvargas
ParticipanteMarlontk,
Resolvi o problema em parte.
Estou tentando fazer algo de forma mais automatizada.
Usamos o ERP da Microsiga, e eu tenho um script que exporta algumas tabelas para TXT… e o Analista que mexe com a folha de pagamento utiliza essas tabelas em TXT para outros trabalhos.
Qual o meu problema então?
A versão que usamos da Microsiga é o Protheus8, e vamos migrar para o Protheus10… só que a estrutura das tabelas é diferente.
Por exemplo, a tabelas SRV010 (versão atual) tem 63 campos e a mesma tabela para a versão nova tem 74 campos.
Já temos a versão nova numa base teste, então preciso comparar a tabela SRV010 com a tabela SRV020… só que tenho que fazer isso com mais ou menos umas 80 tabelas.Preciso comparar TABELAS DIFERENTES em INSTANCIAS DIFERENTES
4 de junho de 2009 às 11:58 pm #87160marlontk
ParticipanteMpvargas,
tem alguma relacao(regra) entre os nomes tipoSRV010 com a tabela SRV020 como tu mostrou so modificou o numero 10 para o 20 ou os nomes são bem diferentes?
-
AutorPosts
- Você deve fazer login para responder a este tópico.