|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Claire Inscription : septembre 2003 Messages : 8 ![]() |
Bonjour,
Je rencontre un problème que je n’arrive pas à comprendre suite à la migration d’oracle 10.2.0.4 en 11.2.0.2. j'ai un traitement que j'ai volontairement simplifié qui insère dans une table TABLE_TEST_CA des lignes qui sont sélectionnées via une fonction F_TEST_CA. F_TEST_CA sélectionne les lignes dans la table TABLE_TEST_CA et les renvoie par une table type T_TEST_CA_TABLE. A noter qu’il n’y a aucun trigger, aucune contrainte sur TABLE_TEST_CA. Je fais ensuite l’insertion : Code :
Le même traitement ne plante pas sur notre base en oracle 10.2.0.4. Je cherche à savoir quel est le problème. Si vous avez rencontré ce style de problème lors de la migration 11G, je suis intéressée par vos pistes ! Ci-dessous les scripts utilisés pour mon test que vous pouvez exécuter : Code :
|
||||
|
|
00
|
|
|
#2 |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Votre problème vient du fameux concept qui différencie Oracle des autres bases de données ''Read consistency’’ ou plus exactement ''Statement-Level Read Consistency''. Oracle considère votre function comme ne faisant pas partie de l’instruction insert et donc, il la soumet à son propre ''Read consistent state'' et ne l’associe pas au même SCN (System Commit Number) qu’il attribue à votre INSERT. Et de ce point de vue, votre function semble, ne pas faire partie du même block que l’instruction initiale INSERT. D’où l’erreur.
C’est un peu bizarre mais c’est comme cela que fonctionne Oracle. Pour résoudre votre problème, utilisez directement le sql qui se trouve dans la fonction plutôt que la fonction elle même. Il serait même mieux du point de vue performance. Pour plus de détails je vous invite à lire ceci : http://download.oracle.com/docs/cd/B...htm#sthref1955 "If a SELECT list contains a function, then the database applies statement-level read consistency at the statement level for SQL run within the PL/SQL function code, rather than at the parent SQL level. For example, a function could access a table whose data is changed and committed by another user. For each execution of the SELECT in the function, a new read consistent snapshot is established." http://harmfultriggers.blogspot.com/ |
|
|
21
|
|
|
#3 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Tout à fait d'accord pour n'utiliser qu'une requête mais c'est pas forcément possible de réécrire une fonction table en SQL, en tout cas ça peut être bien compliqué.
Je me disais qu'un contournement pourrait être d'utiliser une CTE avec le hint (non documenté) materialize, ça "fonctionne" mais le hint génère un comportement étrange. Il est nécessaire de commit pour voir les modifications apportées. J'avais pourtant des noms de tables temporaires un peu différents par exemple SYS_TEMP_0FD9D6626_1A590B et SYS_TEMP_0FD9D6627_1A590B mais c'est peut être quand même la même table derrière : Code :
|
||
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Claire Inscription : septembre 2003 Messages : 8 ![]() |
Merci infiniment pour vos réponses, cela nous a permis de trouver une solution de contournement simple pour conserver le même SCN entre le retour de la fonction et l'insert :
Code :
![]() Par contre, sauriez-vous pourquoi ce code marchait en oracle 10.2 ? Nous avons posé la question sur métalink : Voici pour l'instant la réponse : I ran your testcase on different operating systems and versions as you can see in the TESTCASE sections below. The problem only happened on versions >= 11.1.0.6 when running the testcase in a user schema different from sys/.... as sysdba, e.g. scott/tiger or a new self-created user. Granting the DBA role to the user didn't solve the issue. Can you please double-check this on your system? Is the testcase also working fine when you connect as sys/change_on_install as sysdba, even on 11G? |
||
|
|
00
|
|
|
#5 | |
|
Invité régulier
![]() Administrateur de base de données Inscription : décembre 2011 Messages : 4 ![]() |
Citation:
C'est juste une idée comme ça, pas sûr que ce soit en rapport avec ton problème. Il faudrait faire l'essai en mettant DEFERRED_SEGMENT_CREATION à false pour être fixé. |
|
|
|
00
|
|
|
#6 | |||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
|
|||
|
|
01
|
|
|
#7 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
Code :
|
|||
|
|
20
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Et pour la 11 plantage
Code :
|
||
|
|
10
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
A noter que l'exemple suivant fonctionne en 11g
Code :
|
||
|
|
10
|
|
|
#10 | ||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Je voulais tout simplement préciser que l'erreur
Code :
Ceci dit, merci d'avoir montré que le même code qui fonctionnait en 10g ne fonctionne plus en 11g. De plus, si quelqu'un peut reproduire le cas en 8i et en 9i, nous pourrions alors savoir si le même problème se produisait dans ces deux vielles versions |
||
|
|
01
|
|
|
#11 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut !
Juste pour faire chier un peu : SCN = System Change Number. Quand on parle du moment où on en attribue un au commit, on dit Commit SCN (genre à contrario de celui qui est attribué au début du statement pour définir le snapshot courant).
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
10
|
|
|
#12 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Lorsqu’une requête ou une transaction est commencée, elle fait appel à une procédure interne nommée (kcmgss - Get Snapshot SCN) et à chaque fois qu’une transaction fait un commit elle augment son SCN via une autre routine appelée (kcmgas- Get and Advance SCN). Par contre, il existe d’autres situations, autre que le commit, où le SCN est incrémenté. C’est pourquoi le nom de System Change Number est plus approprié que System Commit Number. Je suis en train de lire un livre de Jonathan Lewis où tout ce genre de petits et intéressants détails est mentionné avec beaucoup de précision |
|
|
|
01
|
|
|
#13 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
En fait il n’y a aucun raison d’avoir une erreur de la table en mutation dans ce cas. La table n’est pas en mutation au moment de la lecture par la fonction et la fonction n’est pas pipelined ! Par conséquence la fonction va lire tous les enregistrements en mémoire avant de donner le contrôle à l’environnement appelant. Dans ce cas il n’y aucun risque d’avoir des résultats qui dépendent de l’ordre d’exécution des divers étapes et par conséquence du besoin de se protéger via l’erreur de la table en mutation. Oui il y a un bug mais il est dans oracle 11g et non pas avant. Analysez aussi les exemples fournis pour la version 11g qui fonctionnent. Demandez-vous aussi pourquoi le support Oracle ne réponde pas comme vous. |
|
|
|
20
|
|
|
#14 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour Mohamed,
Citation:
Et, est-ce que ça ne te donne pas une envie folle d'en faire une traduction française ? Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#15 | |
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
J'ai vraiment pensé à ça. Mais uniquement si Apress me donne l'autorisation de faire circuler cette traduction. Autrement, je saisi cette occasion pour te remercier de m'avoir fait venir sur ce forum où j'ai appris beaucoup de choses et où j'ai pu enfin utiliser la langue française dans le monde Oracle. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com