FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Lista de Membros Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 673.940 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 20-04-2005, 10:10   #1 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão SQL - Sequencia de numeros

É possivel criar uma sequencia de numeros, q vao do 1 até um numero X ?
Tipo..
----------
1
2
3
4
5
6
7
8
9
...
X


Entenderam?
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 20-04-2005, 14:21   #2 (permalink)
rwar
GeeK
 
Avatar de rwar
 
Registrado em: Aug 2002
Localização: Porto Alegre/Passo Fundo (RS) - 90010-290
Mensagens: 2.463
Reputação: 19 rwar está indo no caminho certo
Enviar mensagem via MSN para rwar
Padrão

Não! Você quer criar um contador em uma sentença SQL? :?:
__________________
Em busca de certificações Linux (LPI + RHCE)!!!
rwar está offline   Responder com Quote
Antigo 20-04-2005, 14:29   #3 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Eh pra umas ideias malucas... seria para aproveitar codigos de registros q n estao sendo usados, pois o sequencial do banco tem akele problema...
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 20-04-2005, 14:49   #4 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Olha a minha ideia

Codigo
----------
1
5
6
7
8
10
11

Ai eu ia fazer um Select pra listar :
1
2
3
4
5
6
7
8
9
10
11 <-- Max(codigo)
minus (tirar os codigos ja usados)...

Ia ficar assim
2
3
4
9

Ai eu pegaria o menor desse resultado... o 2!

será q da pra fazer?


Ou tem outra maneira mais simples?

Uso o Oracle e Forms
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 20-04-2005, 16:04   #5 (permalink)
Lgub
Super Participante
 
Avatar de Lgub
 
Registrado em: Dec 2001
Mensagens: 936
Reputação: 18 Lgub está indo no caminho certo
Padrão

CAra se o campo for auto numeravel vc não vai conseguir inserir esse ID. Pois o banco iria ultilizar o proximo ID valido.
__________________
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
Lgub está offline   Responder com Quote
Antigo 20-04-2005, 16:07   #6 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Não, não esta auto numeravel.
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 20-04-2005, 17:04   #7 (permalink)
Acquila
Super Participante
 
Registrado em: Mar 2002
Mensagens: 654
Reputação: 17 Acquila está indo no caminho certo
Padrão

Olha, se vc tem uma tabela com um campo contendo uma sequência de números, vc pode usar a função enum() pra montar uma lista sequencial. Como vc não disse qual o SGDB que está usando, fica dificil dar o caminho certo ( se é que ele existe do jeito que vc quer). Dá uma olhada em "enum" no manual do seu SGDB.

[]!
Acquila está offline   Responder com Quote
Antigo 20-04-2005, 17:09   #8 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Acquila

Citação:
Uso o Oracle e Forms
O Oracle n eh um SGDB???
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 20-04-2005, 18:01   #9 (permalink)
jqueiroz
Administrador
 
Avatar de jqueiroz
 
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 7
Mensagens: 83.483
Reputação: 226 jqueiroz desabilitou a reputação
Padrão

Talvez se vc fizesse em Perl... o Perl tem módulos pra trabalhar tanto com vários SQLs.

Pesquise sobre os módulos DBI e DBD do Perl.
__________________
Dúvidas sobre o Fórum? Guia de Utilização V2.0
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2009 JQueiroz/FGdH
BSCI: √ ISCW: □ MCSN: □ OTN: □ 25% CCSI: □ | Conheça o Novo Bebuns
jqueiroz está offline   Responder com Quote
Antigo 20-04-2005, 18:43   #10 (permalink)
Kakao
Super Participante
 
Avatar de Kakao
 
Registrado em: May 2002
Localização: Brasília
Mensagens: 553
Reputação: 17 Kakao possui ótimo potencial
Padrão

Se fosse Postgresql eu faria:

select id from generate_series(1, (select max(id) from minha_tabela)) as s(id)
except
select id from minha_tabela

Não sei se o Oracle tem uma função semelhante ao generate_series. Se não tiver o jeito é criar uma função que gere a série de números. Pode sair caro se a tabela for grande.

Qual seria a vantagem de reaproveitar os números?
Kakao está offline   Responder com Quote
Antigo 21-04-2005, 0:51   #11 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Citação:
Qual seria a vantagem de reaproveitar os números?
O código não eh automatico por default(por opcao do usuario), entao se ele colocar um codigo 555555, por exemplo.... Todos os valores abaixo de 555555 não serao utilizados ( c usar o max(....)+1 ) para os futuros registros, ou seja, c ele colocar 999999 n sera possivel inserir mais nenhum registro... Entao quero uma funcao que mostre o menor numero vago, para q nao aconteca esse perda.
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 21-04-2005, 12:16   #12 (permalink)
Acquila
Super Participante
 
Registrado em: Mar 2002
Mensagens: 654
Reputação: 17 Acquila está indo no caminho certo
Padrão

Citação:
Postado Originalmente por msfabris
O código não eh automatico por default(por opcao do usuario), entao se ele colocar um codigo 555555, por exemplo.... ...
Hmmm... Vc TEM CERTEZA que é assim mesmo que acontece ?? É que se vc tem um campo int como chave primária, por exemplo, e este não é auto-incremento, ele aceita valores em qualquer ordem e o SGDB só vai reclamar se houver repetição de algum número.

[]!
Acquila está offline   Responder com Quote
Antigo 21-04-2005, 17:06   #13 (permalink)
Kakao
Super Participante
 
Avatar de Kakao
 
Registrado em: May 2002
Localização: Brasília
Mensagens: 553
Reputação: 17 Kakao possui ótimo potencial
Padrão

Criei a função gera_serie em PLpgSQL. Fica assim:

tabela_codigo:
Código:
teste=# select * from tabela_codigo; codigo -------- 1 2 3 5 6 8 10 (7 rows)
Para selecionar os códigos não utilizados:
Código:
teste=# select a.codigo from gera_serie(1, (select max(codigo) from tabela_codigo), 1) as a(codigo) teste-# except teste-# select codigo from tabela_codigo; codigo -------- 4 7 9 (3 rows)
Para selecionar o primeiro código não utilizado:
Código:
teste=# select a.codigo from gera_serie(1, (select max(codigo) from tabela_codigo), 1) as a(codigo) teste-# except teste-# select codigo from tabela_codigo teste-# order by codigo teste-# limit 1 teste-# ; codigo -------- 4 (1 row)
Função gera_serie(inicio, fim, passo):
Código:
CREATE OR REPLACE FUNCTION gera_serie(int8, int8, int8) RETURNS SETOF int8 AS $BODY$ declare inicio alias for $1; fim alias for $2; passo alias for $3; i bigint := inicio; begin while i <= fim loop return next i; i := i + passo; end loop; return; end; $BODY$ LANGUAGE 'plpgsql' STABLE;
O Oracle é bem parecido com o Postgresql então acho que fica fácil adaptar.
Kakao está offline   Responder com Quote
Antigo 22-04-2005, 0:37   #14 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Valew Kakao!!! Amanha ja vou testar!!! Muito Obrigado!
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 22-04-2005, 9:47   #15 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Eu fiz a função assim, ela compila e nao da erro:
Código:
CREATE OR REPLACE FUNCTION GERA_SERIE(INICIO NUMBER,FIM NUMBER, PASSO NUMBER) RETURN NUMBER IS CODIGO NUMBER(7) :=INICIO; BEGIN WHILE CODIGO <= FIM LOOP RETURN(CODIGO); ---Talvez falte algo com NEXT ??? CODIGO := CODIGO + PASSO; END LOOP; END GERA_SERIE;

E o select assim:
Código:
SELECT * FROM GERA_SERIE(1,(SELECT MAX(CD_APLICATIVO) FROM APLICATIVOS),1) EXCEPT SELECT CD_APLICATIVO FROM APLICATIVOS;
Mas esta dizendo q está invalido!

Ai eu fiz um teste assim:
Código:
SELECT * FROM GERA_SERIE(1,30,1);
E agora ta dando o erro Ora-04044 - dizendo q nao c pode colocar funcoes ali onde está.


Como faço isso entao?
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 22-04-2005, 10:13   #16 (permalink)
Kakao
Super Participante
 
Avatar de Kakao
 
Registrado em: May 2002
Localização: Brasília
Mensagens: 553
Reputação: 17 Kakao possui ótimo potencial
Padrão

CREATE OR REPLACE FUNCTION GERA_SERIE(INICIO NUMBER,FIM NUMBER, PASSO NUMBER)
RETURN NUMBER IS CODIGO NUMBER(7) :=INICIO;
BEGIN

Ali no Return tem que ser um record set. Não sei como você fala isso no Oracle. Procurei o manual na Web e não achei.

WHILE CODIGO <= FIM LOOP
RETURN(CODIGO); ---Talvez falte algo com NEXT ???
CODIGO := CODIGO + PASSO;
END LOOP;

Como você vai retornar um record set não pode ser um return simples pois ele sai da função na primeira interação do laço. Tem que ter uma forma de dizer que ele deve acumular o resultado no record set. No postgresql é RETURN NEXT expressão. E depois do fim do laço ai sim um RETURN para sair da função. Não sei se este último é obrigatório no Oracle. No PG é.
Kakao está offline   Responder com Quote
Antigo 22-04-2005, 10:43   #17 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Kakao
Eu nao consegui encontrar como se faz esses comandos no Oracle. Alguem pode me ajudar?



Aproveitando... parece que o oracle tem uma tabela temporaria para que possamos usar... Existe? Qual o nome?
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Antigo 22-04-2005, 11:05   #18 (permalink)
Kakao
Super Participante
 
Avatar de Kakao
 
Registrado em: May 2002
Localização: Brasília
Mensagens: 553
Reputação: 17 Kakao possui ótimo potencial
Padrão

Achei este exemplo do que ele chama de pipelined table function:

http://www.akadia.com/services/ora_pipe_functions.html
Kakao está offline   Responder com Quote
Antigo 22-04-2005, 11:13   #19 (permalink)
Kakao
Super Participante
 
Avatar de Kakao
 
Registrado em: May 2002
Localização: Brasília
Mensagens: 553
Reputação: 17 Kakao possui ótimo potencial
Padrão

Eu acho que é mais ou menos isso (chutando porque não tenho como testar):

Código:
create type codigo as table of number
Código:
CREATE OR REPLACE FUNCTION GERA_SERIE(INICIO NUMBER,FIM NUMBER, PASSO NUMBER) RETURN codigo PIPELINED IS CODIGO NUMBER(7) :=INICIO; BEGIN WHILE CODIGO <= FIM LOOP CODIGO := CODIGO + PASSO; PIPE ROW(codigo); END LOOP; RETURN; END GERA_SERIE;
Kakao está offline   Responder com Quote
Antigo 22-04-2005, 11:41   #20 (permalink)
msfabris
Super Participante
 
Registrado em: Apr 2003
Localização: Criciúma/SC
Mensagens: 592
Reputação: 15 msfabris está indo no caminho certo
Enviar mensagem via MSN para msfabris
Padrão

Código:
create type codigo as table of number;
Ele diz q o Create eh invalido...



Akele Pipelined e pipe row ele aceita e compila, mas o resultado ta vindo soh um(1), axo q eh porque o return n ta em forma de tabela:

------
1
1
1

Alguma dica?
__________________
|Athlon 2600+ Barton||ASUS A7N8X Deluxe||GeForce FX5600XT 128Mb||HD Seagate 120Gb SATA||2 HD Seagate 80GB||Samsung 710N||512Mb Kingston DDR 400||ADSL Turbo (DSL-500G)|HT 5.1 2600watts| http://photobucket.com/albums/v422/msfabris/Casemod/
msfabris está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -2. Agora são 15:24.