PL/SQL Append_Values Indicateur donne le message d'erreur
Je vais avoir du mal à faire un grand nombre d'insertions dans une table Oracle à l'aide de PL/SQL. Ma requête va ligne par ligne et pour chaque ligne de la requête fait un calcul pour déterminer le nombre de lignes nécessaires à l'insertion dans l'autre table. Le classique des inserts de travail, mais le code prend du temps à s'exécuter pour un grand nombre de lignes. Pour accélérer les insertions j'ai essayé d'utiliser le Append_Values
soupçon comme dans l'exemple suivant:
BEGIN
FOR iter in 1..100 LOOP
INSERT /*+ APPEND_VALUES*/ INTO test_append_value_hint values (iter);
END LOOP;
END;
Je reçois le message d'erreur suivant lorsque vous faites ceci:
ORA-12838: cannot read/modify an object after modifying it in parallel
ORA-06512: at line 3
12838. 00000 - "cannot read/modify an object after modifying it in parallel"
*Cause: Within the same transaction, an attempt was made to add read or
modification statements on a table after it had been modified in parallel
or with direct load. This is not permitted.
*Action: Rewrite the transaction, or break it up into two transactions
one containing the initial modification and the second containing the
parallel modification operation.
Quelqu'un a des idées pour rendre ce code fonctionne, ou comment insérer rapidement un grand nombre de lignes dans une autre table?
Je me suis donné un tableau avec des individus aussi bien que les dates de début et fin que les individus inscrits dans un programme. Pour la table de sortie, j'ai besoin d'une ligne pour chaque mois/année où la personne a été inscrite dans le programme. Donc, si une personne a une date de début de 12/21/2012 et une date de fin de 4/10/2013, j'aurais besoin de cinq documents pour l'individu (un record pour 12/2012, 01/2013, 02/2013, 03/2013, et 04/2013). Mon code PL/SQL sans le APPEND_VALUES astuce fonctionne bien pour les petites tables, mais ma table a environ un million de lignes.
Plutôt ne pas l'utiliser. En particulier à partir de PL/SQL, il devrait être possible de réécrire le code en pur SQL "insert /* +AJOUTER */ ..select". En outre, cette solution n'est pas parce qu'une seule session peut ajouter à une table en même temps. En outre voie directe d'écriture est utilisé que dans certaines circonstances, comme aucun FKs sur une table. Si vous voulez vraiment faire de l'accélération de votre ETL utilisation
ALTER SESSION FORCE PARALLEL DML
.OriginalL'auteur user3312037 | 2014-02-14
Vous devez vous connecter pour publier un commentaire.
Vous obtenez ce message d'erreur parce que tous vos INSÉRER exécute comme indépendante de l'instruction DML. Oracle empêche de lecture/écriture sur la table où les données ont été ajoutés à l'aide de chemin direct insérer jusqu'à sa validation.
Techniquement, vous pouvez utiliser PL/SQL collections et POURTOUT à la place:
Mais la question de Justin demandé est en action - où sont vos données en provenance et pourquoi n'utilisez-vous pas l'habitude d'INSÉRER /*+ ajouter */EN ... SÉLECTIONNEZ à PARTIR de l'approche ?
OriginalL'auteur Dmitry Nikiforov
Salut à vous Demander d'utiliser commit après l'insérer en tant que ci-dessous:
OriginalL'auteur Shailesh Gupta
Nous ne pouvons pas exécuter 2 DML transactions dans une table sans commettre la première transaction. Et donc cette erreur sera levée.
DONC, valider votre transaction précédente dans ce tableau et poursuivre la deuxième opération.
OriginalL'auteur user8758015