2009-12-09 9 views
0

J'ai une table (dans ORADB) contenant deux colonnes: clé unique VARCHAR et clé unique NUMBER générée à partir d'une séquence.insertion de données de dictionnaire ou sélection (oracle, java)

J'ai besoin de mon code Java pour ajouter constamment (et en parallèle) des enregistrements à cette colonne chaque fois qu'une nouvelle clé VARCHAR est obtenue, en retournant la nouvelle clé NUMBER générée. Ou retourne la clé NUMBER existante quand elle obtient une VARCHAR existante (elle ne l'insère pas alors, ce qui jetterait une exception bien sûr en raison de la violation de clé uniq).

Cette procédure serait exécutée à partir de nombreux clients (Java) travaillant en parallèle.

espère que mon anglais est compréhensible :)

Quel est le meilleur (peut-être en utilisant PL/SQL au lieu de code Java ...) façon de le faire?

+0

Et que pensez-vous d'essayer d'INSÉRER le nouvel enregistrement d'abord, et de faire SELECT à chaque fois qu'une exception a été levée avant? – Chris

+0

Cela dépend de quel cas vous pensez est plus fréquent. J'ai supposé que vous récupéreriez des mots existants plus souvent que d'ajouter maintenant ceux. Si vous en ajoutez principalement de nouveaux, alors oui, essayez d'abord l'INSERT. – Thilo

Répondre

2

Je ne pense pas que vous pouvez faire mieux que

  1. SELECT the_number FROM the_table where the_key = :key

  2. se trouve, le retourner

  3. sinon trouvé, INSERT INTO the_table SELECT :key, the_seq.NEXT_VAL RETURNING the_number INTO :number et COMMIT

  4. cela pourrait soulever un ORA-00001 (duplicata de la clé primaire) si le timing est malchanceux. Dans ce cas, SELECT à nouveau.

Je ne sais pas si JDBC prend en charge RETOURNER, de sorte que vous pourriez avoir besoin de l'envelopper dans une procédure stockée (base de données enregistre également les allers-retours).

Vous pouvez utiliser une table organisée avec des index (avec la clé en tant que clé primaire), ce qui accélère la recherche.