Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

bastard2003

[Resolvido] tabela com colunas dinamicas

Recommended Posts

Salve salve galera beleza?

seguinte tenho um grande problema pra trazer para ver se vcs conseguem me ajudar!

 

vou tentar explicar mais ou menos qq eu to fazendo pra ver se vcs conseguem entender meu problema!

 

atualmente tenho uma estrutura em php que gera uma tabela com N colunas, e uma unica linha!

 

depois de criado essa tabela temporaria eu tenho q ler ela para poder reduzir os valores para uma outra tabela q vai ter as informações dessas colunas e mais alguns valores adicionais,

---- cada coluna da tabela temporaria vira uma linha na tabela permanente

 

qual meu problema:

 

tenho uma tabela com 100 COLUNAS e tenho que fazer essas colunas virarem REGISTROS em uma outra tabela, alguem tem alguma ideia de como posso resolver isso? o problema é q a tabela é dinamica ja pesquisei por pivot table, mas não vi nenhum exemplo de como usar ela para uma tabela com o numero de colunas variavel.

 

existe a possibilidade de criar um SP ou trigger ou até mesmo uma função pra resolver isso?!

vou ficar no aguardo se vcs conseguirem me dar alguma ideia aceito de MT grado! ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se este exemplo ajuda ...

 


DECLARE 
  teste VARCHAR2(100);   
  sSql varchar2(2000);
  type Meucursor is REF CURSOR;
  cvTabela Meucursor;
  row_cvTabela USER_TABLESPACES%rowtype;
begin
  sSql := 'SELECT * FROM USER_TABLESPACES';
  dbms_output.put_line(SSQL);
  Open cvTabela for sSql;
  LOOP
    FETCH cvTabela into row_cvTabela;
      EXIT WHEN cvTabela%NOTFOUND;
    dbms_output.put_line(row_cvTabela.BLOCK_SIZE || ' ' ||
                         row_cvTabela.TABLESPACE_NAME);
  END LOOP;
  CLOSE cvTabela;
end;
/

Compartilhar este post


Link para o post
Compartilhar em outros sites

motta:

não consegui entender muito bem teu codigo, todas as colunas da minha tabela são do tipo inteiro, qndo tentei mudar o sql para buscar dessa tabela deu erro,

seria possivel você explicar um pouco o codigo?

eu trabalho a varios anos com mysql, mas faz pouco tempo que estou utilizando oracle por isso não conheço ainda todos os recursos que o banco oferece.

agradeço muito a sua ajuda, mas se não for encomodo gostaria dessa explicação a mais! xd

 

a minha tabela final possui 6 colunas! mas os outros valores eu ja tenho disponiveis.

 

esse bloco de codigo que voce passou é para criar uma function, procedure ou simplesmente executalo?

 

tem como executar os inserts da tabela final dentro do loop??

 

muito obrigado até o momento galera, grande abraço

 

motta:

 

estudando melhor teu codigo e navegando um poco consegui entender ele parcialmente

por exemplo você esta usado as colunas BLOCK_SIZE, e TABLESPACE_NAME da tabela USER_TABLESPACES,

no meu caso tentei executar com o nome da minha tabela e o nome das minhas colunas, porem deu erro de variavel não declara,

troquei a tabela da variavel row_cvTabela e no select tambem, porem não resolveu.

outra coisa, nesse caso você esta dando o while em torno das linhas ou das colunas?

e no caso de não ter os nomes exatos das colunas? como essa tabela com N colunas é gerada automaticamente pelo sistema

eu não tenho um padrão de nomes corretos para ela, tem como trabalhar com esse script sem utilizar o nome das colunas?!

 

consegui executar os inserts no final do script e funcionou corretamente.

 

fico no aguardo de alguma novidade.

 

abraços

e obrigado novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

DECLARE 
  teste VARCHAR2(100);   
  sSql varchar2(2000); --receberá o sql
  type Meucursor is REF CURSOR;--define um tipo cursor
  cvTabela Meucursor; -- variavel do tipo definido acima
  row_cvTabela USER_TABLESPACES%rowtype; -- um row (uma lista) com as colunas da tabela USER_TABLESPACES (exemplo)
begin
  sSql := 'SELECT * FROM USER_TABLESPACES';-- sql
  dbms_output.put_line(SSQL);--lista o sql
  Open cvTabela for sSql;-- abre o cursor
  LOOP
    FETCH cvTabela into row_cvTabela;-- joga os dados do result set no row criado acima
      EXIT WHEN cvTabela%NOTFOUND;-- sai qdo fim
    dbms_output.put_line(row_cvTabela.BLOCK_SIZE || ' ' || row_cvTabela.TABLESPACE_NAME); -- lista duas das colunas apenas para exemplo
  END LOOP;
  CLOSE cvTabela;-- fecha o cursor 
end;
/

Creio que você precisará criar uma Procedure para fazer esta conversão.

 

Faça um exemplo com 3 colunas do seu problema pois não sei se entendi ao certo a questão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe a possibilidade de eu listar N colunas de uma tabela sem saber o nome das colunas?!

 

 

o meu caso é seguinte... existe um processo que agrupa VARIOS sql, com uma coluna de resultado cada, e esse resultado dessa coluna é enviado para uma tabela seria basicamente isso:

 

create table xxx as

select (select 1 from dual as) as colunaC,

(select 2 from dual as) as linha2,

(select 2,65 from dual as) as cols2

from dual

 

o unico problema é q a tabela é gerada com umas 100 colunas e eu não sei o nome delas, ai é q ta o problema.

 

o que eu quero fazer é pegar o resultado dessa tabela [ que tem apenas uma linha e muita colunas ] e enviar cada coluna como um registro numa outra tabela.

 

acho que agora consegui explicar mais ou menos meu problema.

muito obrigado novamente pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe a possibilidade de eu listar N colunas de uma tabela sem saber o nome das colunas?!

 

SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '<TABELA>' ORDER BY COLUMN_ID

Com base neste SQL pode-se montar outros SQL´s mas isto requer um pouco de conhecimento de PLSQL.

 

Veja um exemplo de um script gerado de códigos aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

falaaa motta... seguinte.. executei esse exemplo que você me falou dei uma olhada la... consegui fazer ele gerar todos os nomes das colunas das tabelas na minha nova procedure mas existe como eu fazer ele executar o

row_cvTabela.R.COLUMN_NAME!?

 

tipo fazer ele executar a consulta com o nome da coluna q eu quero? passando só o R.COLUMN_NAME ele insere o nome da coluna e não executa o select daquela coluna!

conseguiu me entender mais ou menos? heheheh

 

a parte de executar os 2 loops ta funcionando corretamente teus exemplos estão sendo MT bem explicado obrigado!

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

As queries teriam de ser montadas de forma dinamica, não é simples mas não é bicho de sete cabeças.

 

Lembro que em geral quando se precisa de uma operação mais complicada o problema é no modelo, talvez um modela mais simples resolva o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

como assim no modelo?

existe a possibilidade de fazer isso que eu quero? tipo... eu não to com a a consulta aqui ta la na empresa mas seria basicamente aquele exemplo que tu me mandou

 

 

a grosso modo ficaria assim:

DECLARE 
  teste VARCHAR2(100);   
  sSql varchar2(2000);
  type Meucursor is REF CURSOR;
  cvTabela Meucursor;
  row_cvTabela USER_TABLESPACES%rowtype;
begin

FOR coluna IN (SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'minha_tabela' ORDER BY COLUMN_ID)
LOOP
  sSql := 'SELECT * FROM USER_TABLESPACES';
  dbms_output.put_line(SSQL);
  Open cvTabela for sSql;
  LOOP
    FETCH cvTabela into row_cvTabela;
      EXIT WHEN cvTabela%NOTFOUND;
    insert into tabela_final values ([b]row_cvTabela.coluna.COLUMN_NAME[/b])
  END LOOP;
  CLOSE cvTabela;
END LOOP;
end;

 

em negrito o meu problema, se eu deixar só o coluna.COLUMN_NAME ele insere o nome da coluna da tabela se eu executar o row_cvTabela.coluna.COLUMN_NAME da erro heheheh,

tem como fazer ele concatenar e executar o row_cvTabela + o nome da coluna que ele deveria trazer pra me trazer o valor dessa coluna?

 

valeu a mão até agora meu velho!

 

ps: esse codigo eu coloquei dentro de um procedure mesmo! heheheh

Compartilhar este post


Link para o post
Compartilhar em outros sites

O exemplo com USER_TABLESPACES foi só para poder executar em qualquer lugar, troque pela sua tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom dia MOtta, sim isso eu estou fazendo no sSql eu passo a consulta da minha tabela que tem N colunas mas nesse consulta eu to fazendo "select * from tabela" o problema é que qndo vou fazer o output eu não consigo usar um nome dinamico que vem do for das consulta de colunas da tabela,

como o row_cvTabela é declarado com o nome da tabela la em cima, ele só aceita que eu coloque os nomes de colunas que aquela tabela tem e não usar uma variavel do for coluna que tem no meu exemplo a cima.

 

conseguiu me entender? caso não eu posto aqui a SP que eu to fazendo pra você ver com mais facilidade

 

abraços e obrigado pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tive curiosidade de fazer isto, tratar um cursor como no Delphi por exemplo (nome e conteúdo), mas por nunca presisar de fato nunca estudei isto melhor.

 

Se um site pode ter ajudar este é o AskTom.

 

Vou ver todavia se consigo evoluir isto aqui.

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeu mesmo cara... vou dar uma olhada nesse site q tu mandou qualquer coisa se eu encontrar la posto aqui o modelo que fiz pra galera poder usar em futuras consultas!

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

infelizmente o site não ta aceitando novas perguntas, diz que esta com uma grande lista de perguntas para responder e não esta liberação novas! :/

 

complicado... tive olhando umas perguntas la... acho que esta aqui é a mais proxima do que eu preciso, não tenho certeza se da pra ser ne mas a verdade é q não tenho certeza :P

 

mas vou continuar pesquisando... outra coisa no teste q estou efetuando consigo até inserir o sql que eu gostaria de executar mas infelizmente ele não executar apenas insere! :/

 

abraços meu velho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente não sei fazer isto, quando tiver um tempo posso dar uma estudada, mas não hoje pois estou meio enrolado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sem galho meu velho.... estamos aqui para aprender não para você fazer todo o trabalho sozinho! hheheheh

 

agradeço MT a ajuda

 

ps: tb ja fui moderador aqui no imasters, mas cuidava da parte de delphi! xd ehhehehheh

Compartilhar este post


Link para o post
Compartilhar em outros sites

consegui terminar motta.. ehhhee.. .dei uma lida numas coisas e encontrei a solução

 

DECLARE 
  teste VARCHAR2(100);   
  sSql varchar2(2000);
  type Meucursor is REF CURSOR;
  cvTabela Meucursor;
  row_cvTabela USER_TABLESPACES%rowtype;
begin

FOR coluna IN (SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'minha_tabela' ORDER BY COLUMN_ID)
LOOP
  sSql := 'SELECT '||coluna.COLUMN_NAME|| ' FROM USER_TABLESPACES';
  dbms_output.put_line(SSQL);
  Open cvTabela for sSql;
  LOOP
    FETCH cvTabela into sSql;
      EXIT WHEN cvTabela%NOTFOUND;
    insert into tabela_final values (sSql)
  END LOOP;
  CLOSE cvTabela;
END LOOP;
end;

ficou basicamente assim... funcionou bem direitinho... heheheh.. gostei da brincadeira... valeu a mão ai na ajuda.

 

grande abraço

 

ps: pode adicionar o concluido ao lado do titulo! xd

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.