Retorno de Tabela Dinâmica

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
felipeMomm
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 12 Jun 2008 4:32 pm

Pessoal,

Estava acostumado a utilizar o SQL Server como banco de dados aqui na empresa, mas surgiu um novo cliente e estamos utilizando o Oracle agora.

Enfim, a minha dúvida é a seguinte, tem como retornar uma table dinâmica através de uma procedure/function/view da vida? Digamos assim, preciso receber como retorno uma tabela que tenha N colunas criadas dinamicamente, ou seja, não poderia ser feita criando um tipo object, pois nele todas as colunas tem que ser especificadas previamente, certo?

Exemplo 1:

Selecionar tudo

ID | Nome | Descrição | Coluna 1 | Coluna 2
Exemplo 2:

Selecionar tudo

ID | Nome | Descrição | Coluna 1 | Coluna 2 | Coluna 3
Sendo que "as Coluna" poderiam existir em quantidades variaveis de acordo com os parametros que eu passar e a lógica que eu programar.

Um outro exemplo seria algo do tipo:
CALL funcaoTeste(2): Faria um looping gerando 2 colunas... se eu passasse 3 como parametro utilizaria o mesmo looping, mas retornaria 3 colunas.

Isso é possível de ser feito? Como fazer? alguém tem algum exemplo? No SQL Server era possível utilizando meio que um EVAL passando uma string com código T-SQL concatenado embutido.

Obrigado.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Com PL/SQL Table, daria pra ser feito, desde que você soubesse o nro de colunas...

Mas, como são dinâmicas, dá uma pesquisada aqui no fórum por REF CURSOR e, caso não ache nada que o ajude, dá um alô pra gente, beleza?
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Bom... pegando pelo seu exemplo, você não precisa informar literalmente o nome das colunas, certo? tipo, poderia ser

ID | NOME | DESC | COL 1 | COl 2 | COL 3

Ok?

Vamos ao exemplo que posso lhe passar...

Selecionar tudo

DECLARE
  NCOLUNAS NUMBER := 10; --Numero de colunas
  VSQLTABELA VARCHAR2(20000); --String responsável pela montagem do sql
  I NUMBER := 0; --Indice
BEGIN
  VSQLTABELA := 'CREATE TABLE DBAAUDIT.EXEMPLO ( '; 
 	--
 	VSQLTABELA := VSQLTABELA||' ID NUMBER(10), NOME VARCHAR2(60), DESCRICAO VARCHAR2(2000), ';
 	LOOP
   	I := I+1; --controle do numero de colunas
    VSQLTABELA := VSQLTABELA||' COLUNA'||TO_CHAR(I)||' VARCHAR2(2000) ';
    --
    IF I < NCOLUNAS THEN --CONTROLE DE VIRGULAS
     	VSQLTABELA := VSQLTABELA||',';
    ELSE
     	VSQLTABELA := VSQLTABELA ||' ) '; --fim da montagem
    END IF;
    --
    EXIT WHEN I = NCOLUNAS; --condiçao de saída
  END LOOP;
  execute immediate(VSQLTABELA);
END;
Acho que com esse exemplo é possível fazer o que você deseja...
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Faltou somente um detalhe...

O execute immediate serve para poder enviar o sql pro banco, assim, criando a tabela desejada...

Observe que também é preciso dar Grants (permissões) para as regras / usuários
Responder
  • Informação
  • Quem está online

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