2009-02-11 7 views
0

Je dois écrire du code pour cloner une entrée de base de données avec des données associées dans d'autres tables et lui attribuer un nouvel ID. Simplifié J'ai une table PRINCIPALE avec une clé d'ID et une sous-table dites SUB1 avec FK d'ID et plusieurs enregistrements pour chaque entrée dans MAIN.
Je souhaite copier les données d'un ID spécifique dans MAIN vers de nouveaux enregistrements en mettant à jour l'ID à une nouvelle valeur pour permettre à l'entrée existante de rester en instantané et la nouvelle entrée en cours de traitement. Je cherche à utiliser des procédures stockées et je me demande s'il est possible/conseillé d'avoir un SP de haut niveau qui invoque d'autres SP pour effectuer le travail?Meilleure approche pour le clonage d'enregistrements de base de données à l'aide de SP

par exemple.


    CREATE PROCEDURE CopyNewVersion (IN oldID) 
    ... 
    BEGIN 
    --copy main record details for passed in oldID, 
    --return the new ID thats been allocated 
     CALL CopyNewMainRecord(IN oldID, OUT newID) 
    --copy all SUB1 records for oldID to newID 
     CALL CopyNewSub1Records(IN oldID, IN newID) 
    --Declare a cursor to return the details in MAIN for newID 
    END 

Je vois les CopyNewSub1Records comme quelque chose comme


    CREATE PROCEDURE CopyNewSub1Records (IN oldID, IN NewID) 
    ... 
    BEGIN 
     --select all records in SUB1 with FK oldID 
     --sp opens a cursor for return 
     CALL GetSUB1Records(oldID) 
     for each returned record in the cursor resultset 
     --insert into SUB1 values(newID, other data for this row,....) 
     CALL CreateSUB1Record(row details) 
    END 

Ma question est, est-il normal d'avoir OUT de newID de CopyNewMainRecord comme IN à CopyNewSub1Records et puis-je utiliser le resultset avec plusieurs lignes à partir du Get SP dans CopyNewSub1Records pour effectuer une boucle lors de l'appel du SP d'insertion?

Je suis actuellement en attente d'être autorisé à créer des SP sur notre environnement DB2 par le DB Admin, c'est pourquoi je demande plutôt que de tenter cela.

Répondre

1

Je ne connais pas très bien DB2, mais je pense que les insertions directes fonctionneraient beaucoup mieux que d'essayer de travailler avec un curseur sur plusieurs étendues. Avoir le paramètre de sortie pour la procédure stockée de copie principale comme une entrée dans l'autre procédure stockée (s) me semble parfaitement logique. Comme un exemple de la façon dont je créerais CopyNewSub1Records, je ferais quelque chose comme ceci: (excusez tous les problèmes de syntaxe ... comme je l'ai dit, je n'utilise pas DB2 - comment savez-vous un paramètre d'un colonne?)

CREATE PROCEDURE CopyNewSub1Records (IN oldID, IN NewID) 
BEGIN 
    INSERT INTO Sub1 
    (
      ID, 
      SubID, 
      Col1, 
      Col2 
    ) 
    SELECT 
      NewID, 
      SubID, 
      Col1, 
      Col2 
    FROM 
      Sub1 
    WHERE 
      ID = oldID 
END 
0

Je n'ai jamais utilisé DB2, mais ne prend-il pas en charge les déclencheurs?

On dirait que ce que vous cherchez à faire est de construire une table d'audit. J'ai déjà fait cela dans SQL Server, et fait correctement, cela peut être très utile. Vous devriez être en mesure de trouver de bonnes informations en recherchant sur Google "DB2 Audit Trigger" ou quelque chose de similaire.

Questions connexes