Copier une ligne dans le même tableau, sans avoir à taper les 50+ noms de colonne (tout en changeant les 2 colonnes)
Au cours de mon travail, j'ai l'habitude de copier des lignes, tandis que l'évolution de leur clé primaire et de leur donner un nouveau cachet et peut-être la modification de la clé étrangère.
Le problème est que je ne veux pas taper tous les noms de colonne en faisant;
insert into table_name
select pk_seq.nextval,
'foreign-key',
col3,
col4...col51
from table_name
where pk_id = "original_primary_key"
Et si je n' * dans l'instruction select, je ne vais pas être en mesure de mettre à jour les 2 premières colonnes...
Est-il un moyen de le faire comment je veux le faire?
Vous devez vous connecter pour publier un commentaire.
Eh bien, il peut ne pas être beaucoup moins verbeux, mais ce PL/SQL est une option:
r.pk := pk_seq.nextval;
devrait être remplacé parselect pk_seq.nextval into r.pk from dual;
where
clause a un test d'égalité sur la clé primaire. Avec une seule ligne, bulk collect/bulk insert ne voudrais pas acheter n'importe quoi.Basé sur Tony répondre:
Nous savons qu'au plus une seule ligne sera retournée depuis que nous sommes à la recherche sur la clé primaire. Et en supposant qu'une clé valide valeur est spécifiée, au moins une ligne sera retournée. Donc, nous n'avons pas besoin de la boucle:
Vous pouvez simplement interroger le dictionnaire de données pour générer le SQL pour vous.
Obtenir le résultat de cette requête, collez-le dans votre instruction SQL, d'adapter, si nécessaire, et le tour est joué.
Désolé - c'est un tout ou rien de l'affaire.
Il n'y a rien entre
SELECT *
et de la liste des colonnes spécifiques, c'est l'un ou l'autre.Vous pouvez créer un "temp" de table, mise à jour de deux colonnes et de faire une insertion-sélectionnez à partir de cette "temp" de table.
Eaxmple:
Vous pourriez faire une procédure stockée simple que de prendre un nom de table et utiliser le dictionnaire de données écrit l'instruction select de texte (le texte de la sélectionner). Ensuite, copier, coller et Modifier.