Pequenas Dúvidas - Tabelas e Outros
Pessoal, tenho algumas dúvidas, e quem puder muito grato:
1) bom, no Firebird eu consigo pegar o nome de tabelas, views, procedures e triggers através de um comando sql, isso porque, algumas vezes o famoso GetTableNames de alguns datasets não funciona.
Bom, minha dúvida é, como posso pegar o nome dessas objetos do banco, através de algum comando interno do banco ou instrução SQL??
2) Como posso gerar uma numeração para as linhas retornadas de um select ? Tipo assim, no DB2 uso o Row_Number(), dessa forma: SELECT ROW_NUMBER() OVER() AS LINHA, NOME FROM TABELA ORDER BY CODIGO e na coluna chamada LINHA, tenho um tipo de sequencia, que começa em 1 e vai até a quantidade de registros listados. Existe algo parecido no postgree, ou tenho que usar um procedure?
3) Tem como gerar uma consulta do tipo CrossTab através de um select (igual ao do SQLServer e Access - Select Coluna1, COluna2, COluna3 from tabela Pivot Coluna1), isto é, pegar o conteúdo de uma coluna e transformar em linha (cabeçalho)??
1) bom, no Firebird eu consigo pegar o nome de tabelas, views, procedures e triggers através de um comando sql, isso porque, algumas vezes o famoso GetTableNames de alguns datasets não funciona.
Bom, minha dúvida é, como posso pegar o nome dessas objetos do banco, através de algum comando interno do banco ou instrução SQL??
2) Como posso gerar uma numeração para as linhas retornadas de um select ? Tipo assim, no DB2 uso o Row_Number(), dessa forma: SELECT ROW_NUMBER() OVER() AS LINHA, NOME FROM TABELA ORDER BY CODIGO e na coluna chamada LINHA, tenho um tipo de sequencia, que começa em 1 e vai até a quantidade de registros listados. Existe algo parecido no postgree, ou tenho que usar um procedure?
3) Tem como gerar uma consulta do tipo CrossTab através de um select (igual ao do SQLServer e Access - Select Coluna1, COluna2, COluna3 from tabela Pivot Coluna1), isto é, pegar o conteúdo de uma coluna e transformar em linha (cabeçalho)??
Firekiller
Curtidas 0
Respostas
Bon Jovi
23/10/2005
1 - Veja na documentacao:
http://www.postgresql.org/docs/8.0/static/information-schema.html
Exemplo básico:
select * from information_schema.tables
where table_schema = ´public´
and table_type = ´BASE TABLE´;
2 - Não tem essa função do DB2, pelo menos até a versão 7.4 tenho certeza que nao, mas vc pode criar um Sequence temporario.
Ex.:
create temp sequence row_number;
-----------------------------------------
//sua query
select nextval(´row_number´) as numero_linha, * from tabela;
-----------------------------------------
drop sequence row_number;
3 - Assim automatico eu não conheço. Talvez tenha que fazer na unha mesmo.
http://www.postgresql.org/docs/8.0/static/information-schema.html
Exemplo básico:
select * from information_schema.tables
where table_schema = ´public´
and table_type = ´BASE TABLE´;
2 - Não tem essa função do DB2, pelo menos até a versão 7.4 tenho certeza que nao, mas vc pode criar um Sequence temporario.
Ex.:
create temp sequence row_number;
-----------------------------------------
//sua query
select nextval(´row_number´) as numero_linha, * from tabela;
-----------------------------------------
drop sequence row_number;
3 - Assim automatico eu não conheço. Talvez tenha que fazer na unha mesmo.
GOSTEI 0
Firekiller
23/10/2005
Valeu Bon Jovi, muito obrigado pelas dicas!
Bom, quanto ao problema 1, está resolvido, já o problema 2 creio que não. Pois pense só, se eu tiver 2 ou mais máquinas acessando ao mesmo tempo a mesma consulta, o contador de uma delas estaria errado, ou seja, continuaria, ou pegaria valores faltando. Teria algum comando do tipo do EXECUTE STATEMENT do firebird para que eu possa fazer isso em tempo de execução. A outra coisa, posso declarar direto dentro de procedures comandos do tipo CREATE SEQUENCE, CREATE TABLE, etc???
Quanto ao problema 3, achei 2 funções chamadas crosstab e crosstab2, porém não consegui fazer funcionar, alguém poderia me dizer se estas funções funcionam gerando uma crosstab mesmo??
Um outro problema é com a função CUBE do postgree. No DB2, ela gera um tipo de relatório, de acordo com o agrupamento, mas no Postgree ela tá dando um erro. Alguém sabe como utilizá-la??
Só lembrando, estou usando Postgree 8.2.
Bom, quanto ao problema 1, está resolvido, já o problema 2 creio que não. Pois pense só, se eu tiver 2 ou mais máquinas acessando ao mesmo tempo a mesma consulta, o contador de uma delas estaria errado, ou seja, continuaria, ou pegaria valores faltando. Teria algum comando do tipo do EXECUTE STATEMENT do firebird para que eu possa fazer isso em tempo de execução. A outra coisa, posso declarar direto dentro de procedures comandos do tipo CREATE SEQUENCE, CREATE TABLE, etc???
Quanto ao problema 3, achei 2 funções chamadas crosstab e crosstab2, porém não consegui fazer funcionar, alguém poderia me dizer se estas funções funcionam gerando uma crosstab mesmo??
Um outro problema é com a função CUBE do postgree. No DB2, ela gera um tipo de relatório, de acordo com o agrupamento, mas no Postgree ela tá dando um erro. Alguém sabe como utilizá-la??
Só lembrando, estou usando Postgree 8.2.
GOSTEI 0
Leonardoffsilva
23/10/2005
No postgreSQL temos os Oid´s que são numerações físicas dos registros. Mas não é muito recomendado operar com eles não!
A versão mais recente do PostgreSQL é a 8.04. A 8.1 ainda deve sar antes do fim deste ano!
A versão mais recente do PostgreSQL é a 8.04. A 8.1 ainda deve sar antes do fim deste ano!
GOSTEI 0
Firekiller
23/10/2005
Desculpe pela falha, é a versão 8.0... mas de qualquer forma meus problemas ainda persistem, pois o OID é a numeração física do registro, mas preciso de uma numeração temporária (apenas para o select).
Por exemplo se tenho os seguintes dados
ID..............|...NOME..............
1................|...B
2................|...A
Se seu colocar SELECT * FROM TABELA, o campo com ID = 1 terá o valor dessa coluna (ROW_NUMBER() ? ) igual a 1, já se eu colocar assim, SELECT * FROM TABELA ORDER BY NOME ele tera o valor da coluna igual a 2.
E quanto ao crosstab ???
Por exemplo se tenho os seguintes dados
ID..............|...NOME..............
1................|...B
2................|...A
Se seu colocar SELECT * FROM TABELA, o campo com ID = 1 terá o valor dessa coluna (ROW_NUMBER() ? ) igual a 1, já se eu colocar assim, SELECT * FROM TABELA ORDER BY NOME ele tera o valor da coluna igual a 2.
E quanto ao crosstab ???
GOSTEI 0
Bon Jovi
23/10/2005
já o problema 2 creio que não. Pois pense só, se eu tiver 2 ou mais máquinas acessando ao mesmo tempo a mesma consulta, o contador de uma delas estaria errado, ou seja, continuaria, ou pegaria valores faltando
Não entendi, pois funciona. Ao criar um TEMP SEQUENCE, somente a sessão do usuário que a criou irá enxergar a mesma, ou seja, cada um terá sua sequência de forma independente.A outra coisa, posso declarar direto dentro de procedures comandos do tipo CREATE SEQUENCE, CREATE TABLE, etc???
Nao sei te responder pois nao costumo criar functions no banco.Qto à outras questões, crie um tópico pra cada coisa que é melhor.
GOSTEI 0
Firekiller
23/10/2005
Bom, obrigado pela atenção, e realmente o problema foi resolvido (em partes) mas por enquanto já dá pra eu me virar.
Vou seguir seu conselho e abrir um novo post então.
Vou seguir seu conselho e abrir um novo post então.
GOSTEI 0