tô com um problemão em um projeto, pode parecer simples mas está dando dor de cabeça, eu não posso postar o código fonte por questões burocráticas e de força maior, mas, vou tentar ser o mais claro possível.
O problema é o seguinte:
Em uma página .jsp eu tenho um commandLink de adicionar um novo registro.;
Esse commandLink abre um modal rich;
Neste modal tenho que adicionar campos obrigatórios e não obrigatórios, mas, na hora de gravar no banco ele envia o código como um Long vazio;
Este código é um auto_increment, como eu estou incluindo um novo registro, se esse campo é null acho que não faz muito sentido, pq de qualquer jeito ele deveria incluir como um novo id.
Teria como eu mandar uma função para pegar o ultimo registro do banco, sem ser max() ou count(), no java pq ai eu não enviaria um Long vazio e sim um valor x++.
No entanto, surgiu uma outra dúvida se eu enviar esse Long acrescido de ++ eu estaria pulando um registro no banco?
O db usado é o Oracle 10g;
O servidor é o WebSphere8 (credo).
Eu peço desculpas por não postar o código.
Agradeço a qualquer caminho que vcs possam me dar!
O oracle não trabalha com auto_increment, apenas o MySQL faz isso.
O oracle utiliza uma sequence, que é, basicamente, uma função que, a cada registro, soma 1 ao último valor inserido.
Existem formas de obter esse índice.
SELECT nome_da_sequence.nextval;
retorna o próximo valor da sequence:
Se nenhum registro existe, o retorno é 1
Se existem 10001, o retorno será 10002
o que eu costumo fazer é colocar uma trigger no oracle para no insert já buscar o nextval da sequence. O problema é que tem que mandar algum valor no lugar da chave primária senão falha o insert.
Está usando algum framework ORM? Annotations ou XML?
[quote=evefuji]o que eu costumo fazer é colocar uma trigger no oracle para no insert já buscar o nextval da sequence. O problema é que tem que mandar algum valor no lugar da chave primária senão falha o insert.
Está usando algum framework ORM? Annotations ou XML?[/quote]
Se você (ou o DBA) criou as tabelas indicando a PK e uma sequence, qual a razão para a trigger e o valor da PK?
Basta inserir o registro e, até, pode-se omitir o valor da PK no INSERT, afinal, o próprio oracle vai saber que precisará informar o valor da mesma.
é que por comodidade (para algumas instruções) não gosto de associar a sequence ao campo da tabela. (por exemplo, não deixa fazer um update na pk, já tive alguns casos que precisava mudar e tive que desassociar a sequencia)
Camarada, me desculpe, mas, se é PK, não há por que fazer update.
Se houver essa necessidade (e não for procedimento de ajuste técnico não homologado, vulgo gambiarra) é por que o sistema (e, principalmente o DER) não foi feito de forma correta.
É parte da normalização de bancos de dados, é a PK que garante a integridade da coisa toda, primeira regra de normalização.
Onde fica a integridade, nesse caso?
Então melhor nem trabalhar com PK.
Camarada, me desculpe, mas, se é PK, não há por que fazer update.
Se houver essa necessidade (e não for procedimento de ajuste técnico não homologado, vulgo gambiarra) é por que o sistema (e, principalmente o DER) não foi feito de forma correta.
É parte da normalização de bancos de dados, é a PK que garante a integridade da coisa toda, primeira regra de normalização.
Onde fica a integridade, nesse caso?
Então melhor nem trabalhar com PK.[/quote]Bom, se acha que não há porque fazer update, é porque não lhe houve situação para isso. Quando você trabalhar com bases de dados de aplicações de terceiros, importando os dados para a sua base de dados, e começar a encontrar inconsistências nos dados (principalmente para fazer data mining, pois quem gera os dados não se preocupa em seguir os padrões de ETL), será obrigado a fazer updates em PK. E se acha melhor não trabalhar com PK, sugiro que estude um pouco em como cruzar tabelas tem um desempenho muito diferente quando os campos de comparação tem PK. Ou pode ser também que você nunca pegou uma base de dados grande o suficiente para que os joins com PK tenham desempenho perceptivelmente diferente. Você pode considerar artifício técnico (vulgo gambiarra), mas é essa solução ou mover dados entre tabelas e qual é mais leve para o banco, dependendo da quantidade de registros na tabela e registros afetados? Com bases de vários TBs não é tão simples assim, uma pequena mudança na forma que vai fazer algo dá uma grande diferença no tempo de execução e um impacto diferente nas outras consultas concorrentes.
@firealexandre, nunca usei o sequencegenerator, costumo usar o @GeneratedValue(strategy=SEQUENCE, generator=“nome da sequencia”), vê se isso te dá uma ideia.
Camarada, me desculpe, mas, se é PK, não há por que fazer update.
Se houver essa necessidade (e não for procedimento de ajuste técnico não homologado, vulgo gambiarra) é por que o sistema (e, principalmente o DER) não foi feito de forma correta.
É parte da normalização de bancos de dados, é a PK que garante a integridade da coisa toda, primeira regra de normalização.
Onde fica a integridade, nesse caso?
Então melhor nem trabalhar com PK.[/quote]Bom, se acha que não há porque fazer update, é porque não lhe houve situação para isso. Quando você trabalhar com bases de dados de aplicações de terceiros, importando os dados para a sua base de dados, e começar a encontrar inconsistências nos dados (principalmente para fazer data mining, pois quem gera os dados não se preocupa em seguir os padrões de ETL), será obrigado a fazer updates em PK. E se acha melhor não trabalhar com PK, sugiro que estude um pouco em como cruzar tabelas tem um desempenho muito diferente quando os campos de comparação tem PK. Ou pode ser também que você nunca pegou uma base de dados grande o suficiente para que os joins com PK tenham desempenho perceptivelmente diferente. Você pode considerar artifício técnico (vulgo gambiarra), mas é essa solução ou mover dados entre tabelas e qual é mais leve para o banco, dependendo da quantidade de registros na tabela e registros afetados? Com bases de vários TBs não é tão simples assim, uma pequena mudança na forma que vai fazer algo dá uma grande diferença no tempo de execução e um impacto diferente nas outras consultas concorrentes.
@firealexandre, nunca usei o sequencegenerator, costumo usar o @GeneratedValue(strategy=SEQUENCE, generator=“nome da sequencia”), vê se isso te dá uma ideia. [/quote]
O problema é que todo mundo só reclama do que veio errado e, continua fazendo errado.
Banco de dados é, sem dúvidas, o ponto mais afetado pela falta de padronização.
Poucas empresas dão atenção à ele, acham que é apenas jogar lá os dados, criar umas tabelas e pronto.
Para que um DBA, se o estagiário sabe fazer crud?
É por isso que as área ligadas ao desenvolvimento e a IT em geral não conseguem se organizar como os médicos, engenheiros e outros profissionais. Já pensou um médico, vendo que o tratamento tava errado e, só por isso, continuar no erro?
Um engenheiro que vai reformar um prédio, manter as paredes tortas, pois o original já estava…
Sei que existem situações em que não temos opção, mas, há várias outras que nos permitem seguir a modelagem, o design, o planejamento, as boas práticas.
E por isso ressaltei a importância de fazer da forma adequada.
Cada um sabe onde aperta o sapato e anda conforme pode.
Certo, você usa como exemplo o médico que continua fazendo errado, mas se eu recebo a informação inconsistente por acaso eu iria até o sistema deles corrigir o processo de extração? Eu iria destruir um prédio inteiro e construir ele de novo para colocar um cano extra que deveria estar desde o início do projeto? Realmente o que vemos na faculdade é que “o mundo é lindo e maravilhoso”, mas todos sabemos que o que vemos na faculdade não é exatamente o que vemos no mercado de trabalho e muitas vezes, preparar o sistema para receber informações inconsistentes de forma que fique mais prático corrigi-las (principalmente quando não é somente um dos processos do cliente que nos traz informações inconsistentes) é a melhor situação. Existem problemas e problemas, e temos que escolher se devemos simplesmente “negar a informação” ou “aceitar a informação daquele jeito” e corrigir as inconsistências nós mesmos. Quando você for trabalhar com uma base de dados gigante e clientes como eu descrevi você vai entender isso. Considere que para data mining não precisamos da informação 100% correta, da mesma forma que para assistir um vídeo não precisamos que o arquivo esteja 100% correto (pode ter alguns bits trocados, ou mesmo o algoritmo de compactação perder alguns detalhes).
Sobre o ponto de padronização, a questão não é “empresas”, mas “pessoas” e praticidade de processos. Esse caso mesmo do data mining, se eles tem em fitas anos de informação, mas o datawarehouse deles só tem os últimos 3 meses de dados, o histórico de mais de um ano mais prático que tem para se trabalhar está em relatórios (planilhas excel), alguns access, alguns datamarts, etc… com margem de erros (alguns de 10%, outros de 3%, etc…) para que eu vou gastar milhões de reais (em casos de bases Teradata com muitos TB de informação) para restaurar os backups de fitas de 5 anos? Os padrões mais importantes não encontraríamos com 10% de erro? com 3% de erro? Dependendo do estudo temos que pedir a informação mais confiável, mas nem sempre os clientes querem gastar milhões para trazer as informações das fitas. Não seria $$$ viável triplicar o valor do projeto, atrasar vários meses, para obter uma melhora de 5% no modelo estatístico.
Ou vamos lá abrir uma ordem de serviço para buscar as informações nas fitas, pegar as assinaturas dos diretores responsáveis, levar ao DBA, pegar as fitas, extrair para uma outra base teradata (não a de produção, lógico), que teria que comprar um hardware mais potente para manter e processar partes do histórico, etc… Para conseguir uma informação 100% confiável quando temos 90% (em geral, o mínimo que aceitamos) de confiabilidade na informação que encontramos em relatórios, datamarts, e afins. Realmente, uma excelente decisão de um excelente administrador.
A tua sugestão foi, na minha opinião, infeliz. Dizer a ele para criar uma trigger.
No meu ponto de vista, a trigger é desnecessária para a questão dele.
Existem N maneiras de fazer o que ele necessita. Só penso que uma trigger seria meio que caçar pardal com rifle para elefante.
Se a tua opinião diverge da minha, que bom, espero que você seja feliz com o modo que pensa.
[quote=drsmachado]evefuji, você está tentando provar o que?
A tua sugestão foi, na minha opinião, infeliz. Dizer a ele para criar uma trigger.
No meu ponto de vista, a trigger é desnecessária para a questão dele.
Existem N maneiras de fazer o que ele necessita. Só penso que uma trigger seria meio que caçar pardal com rifle para elefante.
Se a tua opinião diverge da minha, que bom, espero que você seja feliz com o modo que pensa.[/quote]quem está tentando provar algo é você… Dizendo que o que os outros fazem é gambiarra sem ao menos saber em que ambiente está.
E sobre a sugestão, ele deve analisar o ambiente dele e escolher o que achar melhor. Se ele está aprendendo, é bom conhecer os outros recursos também.