La meilleure façon de faire de la multi-ligne insérer dans Oracle?
Je suis à la recherche d'un bon moyen de faire des multi-insertions de lignes dans une base de données Oracle 9. Les ouvrages suivants, en MySQL, mais ne semble pas être pris en charge dans Oracle.
INSERT INTO TMP_DIM_EXCH_RT
(EXCH_WH_KEY,
EXCH_NAT_KEY,
EXCH_DATE, EXCH_RATE,
FROM_CURCY_CD,
TO_CURCY_CD,
EXCH_EFF_DATE,
EXCH_EFF_END_DATE,
EXCH_LAST_UPDATED_DATE)
VALUES
(1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
(6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne dans Oracle:
La chose à retenir ici est d'utiliser le
from dual
déclaration.(source)
sequnce.nextval
qu'il est interdit dansunion
deselect
. Au lieu de cela, nous pouvons aller avecINSERT ALL
.from dual
et où est le réel données insérées?Dans Oracle, pour insérer plusieurs lignes dans la table t avec des colonnes col1, col2 et col3 vous pouvez utiliser la syntaxe suivante:
SELECT 1 FROM DUAL
n'.SELECT * FROM DUAL
travaille trop.DUAL
, mais je peux vous dire ceDUAL
est: un pré-définie de la table. ExécuterSELECT * FROM DUAL
pour l'afficher.INSERT ALL
nécessite unSELECT
sous-requête. Pour contourner cela,SELECT 1 FROM DUAL
est utilisé pour donner une seule ligne de données factices.ON INSERT...FOR EACH ROW
trigger sur la table pour obtenir les valeurs de votre séquence et de les affecter à la colonne de clé primaire sur chaque ligne qui est inséré. De Plus, cela signifie que le code de l'application n'ont pas à savoir qui de la séquence à utiliser, etc.Utiliser SQL*Loader. Il faut un peu de configuration, mais si ce n'est pas un, sa vaut le coup.
Create Table
Créer CSV
Créer Chargeur De Fichier De Contrôle
Exécuter SQL*Loader commande
Confirmer insérer
SQL*Loader a beaucoup d'options, et peut prendre pratiquement n'importe quel fichier texte en entrée. Vous pouvez même inline les données dans votre fichier de contrôle si vous le souhaitez.
Voici une page avec plus de détails -> SQL*Loader
fruit_id "fruit_seq.nextval"
dans la définition de la colonneChaque fois que j'ai besoin pour ce faire j'ai créer un simple PL/SQL bloc avec une procédure locale comme ceci:
Si vous avez les valeurs que vous souhaitez insérer dans une autre table déjà, alors vous pouvez Insérer à partir d'une instruction select.
Sinon, vous pouvez lister un tas de ligne unique les états d'insertion et de fournir plusieurs requêtes en vrac pour économiser le temps pour quelque chose qui fonctionne dans les deux Oracle et MySQL.
@Espo's solution est également un bon qui fonctionnent dans les deux Oracle et MySQL si vos données n'est pas déjà dans un tableau.
Curseurs peut aussi être utilisée, mais il est inefficace.
La suite de stackoverflow post traite de l'utilisation de curseurs :
INSÉRER et mettre à JOUR un enregistrement à l'aide des curseurs dans oracle
vous pouvez insérer à l'aide de la boucle si vous souhaitez insérer des valeurs aléatoires.