2012-05-18 3 views
1

J'ai un employé, des produits et des tableaux du compteur kilométrique produit qui ressemble à ci-dessousProcédure stockée Oracle pour générer des numéros de séquence?

enter image description here

Chaque employé a un emp_code unique, en fonction du produit qu'il a accès.

Chaque produit aura un préfixe unique à son identifiant.

Je dois générer un identifiant alphanumérique unique par produit et l'attribuer à l'employé.

L'identifiant de cet article sera de 9 caractères, y compris le préfixe.

La table d'odomètre stocke le dernier emp_code attribué aux employés de ce produit particulier.

Comment écrire une procédure stockée pour générer ces emp_codes alphanumériques en fonction du produit pour chaque nouvel employé ajouté dans le système?

S'il vous plaît aider.

EDIT 1:

Juste une petite correction dans le tableau du compteur kilométrique, on n'a pas besoin de stocker le compteur kilométrique A00000001. Au lieu de cela, nous ne pouvions stocker que 00000001, puis ajouter le préfixe.

EDIT 2:

C'est ce que je faire jusqu'à présent.

create or replace PROCEDURE SP_GEN_NEXT_DUMMY_DB_PRISM_ID 
(
    in_product_id number, 
    db_prism_id out varchar2 
) 
AS 
BEGIN 

    UPDATE BI_DB_PRISM_ID_ODOMETER 
    SET DB_PRISM_ID = DB_PRISM_ID + 1 
    WHERE 
    PRODUCT_ID = in_product_id; 

    SELECT to_char(db_prism_id, 'FM00000000') into db_prism_id FROM  BI_DB_PRISM_ID_ODOMETER WHERE PRODUCT_ID = in_product_id; 

END; 

Mais comment puis-je faire en sorte qu'il fonctionne dans une transaction et comment puis-je joins le préfixe du produit au numéro généré.

+0

Doivent-ils être consécutifs dans un produit? – zerkms

+0

@ zerkms.Oui. Ils doivent être consécutifs. Ça ne devrait pas être un nombre aléatoire. – ashishjmeshram

+0

@zerkms. Il peut arriver que nous générions un numéro séquentiel mais il n'est jamais assigné à l'employé dans ce cas il est perdu ce qui nous convient. – ashishjmeshram

Répondre

3

Vous avez deux options que je peux penser:

  1. Créons une séquence Oracle pour chaque produit, peut-être avec une sorte de procédure de maintenance qui permettrait de détecter de nouveaux produits et de créer les séquences dynamiquement.

  2. Faites rouler votre propre code de séquence. Stocker la dernière valeur dans la table Product. Ecrire une procédure qui génère une nouvelle valeur pour un produit donné. La procédure obtiendra d'abord un verrou de ligne sur la table de produits (afin que deux sessions n'obtiennent pas la même valeur en même temps), avancez la valeur et écrivez la nouvelle valeur dans la table Product. Vous auriez besoin que cette procédure soit une transaction autonome (sinon les autres sessions attendraient juste si une session ne commet pas ou annule immédiatement).

Un avantage de # 1 est que c'est le plus rapide. Un inconvénient de # 1 est que vous devez exécuter DDL dynamique, et vous devez vous assurer que le DDL pour un produit a été exécuté avant d'essayer d'insérer des enregistrements odomètre pour cela. Vous devrez peut-être également décider si vous souhaitez supprimer une séquence si un produit est supprimé.

Un autre inconvénient de # 1 est que vous ne pouvez obtenir des valeurs de séquence avec SQL dynamique (vous devez déterminer le nom de la séquence à l'exécution).

Un inconvénient de # 2 est qu'il est facile de se tromper pour un système qui permet DML concurrente. Vous voudrez vous assurer que vous avez la bonne logique, et testez-la sous une forte charge concurrente. En outre, # 2 sera pire que # 1 parce qu'il sérialise l'accès pour chaque produit.

Modifier

« Mais comment puis-je faire en sorte qu'il fonctionne dans une transaction et aussi comment je joins le préfixe du produit au numéro généré. »

Les transactions sont automatiques dans Oracle. Dans ce cas, cependant, ce que vous voulez est autonomous transaction. L'adjonction du préfixe du produit est effectuée à l'aide de la fonction de concaténation de chaîne - par ex. ||

+0

S'il vous plaît voir J'ai mis à jour ma réponse avec ce que j'ai essayé jusqu'à présent. – ashishjmeshram

+0

Réponse mise à jour.En passant, votre code ne précise pas de quelle table vous parlez - vous semblez incrémenter l'ID sur la table de l'odomètre, ce qui n'a pas de sens pour moi? –

1

Semble être que vous dénormaliser le modèle de données ici.

La table de l'odomètre est 1: 1 avec la table des produits, et la valeur de l'odomètre dépend également du nombre d'employés actuellement affectés à ce produit.

Le numéro de séquence emp_code peut être dérivé de l'ID employé et de la table produit. Le préfixe d'identificateur peut être déduit de l'identifiant du produit, donc en fait vous avez des colonnes redondantes et une table redondante dans votre schéma. Etes-vous sûr que vous en avez vraiment besoin?

0

Peut-être qu'il me manque quelque chose ici, si donc acceptez mes excuses.

Il me semble que l'odomètre est simplement un compteur du nombre d'employés ayant accès à chaque produit.

Si c'est le cas, pourquoi ne pas supprimer complètement la table (et la colonne EMP_CODE) et "construire" cette information dans une ou plusieurs vues?

Alessandro

PS: On dirait que j'ai posté la même suggestion de David Aldridge. Désolé pour la confusion.

Questions connexes