Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Test insert delete


Sujet :

SQL Oracle

  1. #21
    Expert éminent sénior
    tu enléves tout, tu fais ton trigger et après tu pourras faire un simple DELETE

  2. #22
    Futur Membre du Club
    Test insert delete
    Mais comme ça je vais avoir 3 select imbriqués
    Et en plus, si y aura une ligne qui n est pas bien inserée, le trigger va sortir, alors que moi je dois suivre les lignes une par une
    C est à dire si une ligne n'est pas inserer, je ne la supprime pas de la table et je passe à la ligne suivante

  3. #23
    Expert éminent sénior
    bah tu fais un curseur dans ce cas évidemment.

  4. #24
    Futur Membre du Club
    Test insert delete
    mais comme ça on va tomber dans le meme cas nn?

  5. #25
    Expert éminent sénior
    la question est : Pourquoi tu veux faire un BULK COLLECT ?

  6. #26
    Futur Membre du Club
    Test insert delete
    Chui obligé de le faire
    Je veux traiter les enregistrement par lots de 1000 lignes

    En plus dans ma requete ce que je comprends pas c'est qu'en virant le commit sa marche, mais si je mets le commit on dirait que le loop de fetch ne marche plus, il s'arrete au premier lot de 1000 enregistrements

  7. #27
    Expert éminent sénior
    Parce que tu as une exception déclenchée que tu ne vois pas à cause du WHEN OTHERS... je te l'ai déjà dit

    Et le traitement pas lot c'est bien mais alors ça veut dire que tu acceptes qu'en cas d'erreur tu peux avoir 1000 lignes non traitées ?

  8. #28
    Futur Membre du Club
    Test insert delete
    Moi ce que je veux faire c'est : traiter les enreg par lot de 1000
    pour chaque 1000 enreg, les parcourir un par un inserer et supprimer chacun(boucle for), si je rencontre un probleme pour un enregistrement je passe au suivant

    Apres je passe au lot suivant

  9. #29
    Expert éminent sénior
    supprime la partie EXCEPTION pour voir l'erreur... je ne le dirais pas une 4eme fois

  10. #30
    Futur Membre du Club
    Test insert delete
    effectivement j'ai eu l erreur ORA-00600 : internal error code

    je comprends pas

  11. #31
    Futur Membre du Club
    Test insert delete
    Si je vire le commit j ai pas cet erreur

  12. #32
    Expert éminent sénior
    Citation Envoyé par orafrance Voir le message
    c'est fiable jusqu'à ce qu'une migration de ligne ou un update soit fait
    Je n'ai pas proposé de les stocker dans une table. Donc c'est quoi le souci qui empêche un traitement de lire le rowid et de les utiliser ?

  13. #33
    Futur Membre du Club
    Test insert delete
    Le probleme c'est l'utilisation du for update skip locked

    est ce que vous avez une solution pour ça

    Il faut que je prends que les enregistrements qui sont pas loked
    c a d si un enregistrement est utilisé par une autre session, il faut pas trop attendre pour qu'il soit libreré

  14. #34
    Expert éminent sénior
    Citation Envoyé par mnitu Voir le message
    Je n'ai pas proposé de les stocker dans une table. Donc c'est quoi le souci qui empêche un traitement de lire le rowid et de les utiliser ?
    rien n'empêche un déplacement de ligne durant l'opération

  15. #35
    Expert éminent sénior
    il faut regarder le fichier des alertes

  16. #36
    Futur Membre du Club
    Test insert delete
    ce qui fou la merde c'est le skip locked, parce que en mettant le commit dans la boucle tout change, il faut faire qu un seul commit à la fin

    Moi je veux faire le test suivant :
    pour chaque ligne ramener par le curseur, il ne faut le supprimer que si elle est bien inserée et inversement

    Voulez vous m aider pour ce test

  17. #37
    Expert éminent sénior
    Citation Envoyé par zico_pro Voir le message
    ce qui fou la merde c'est le skip locked...

    Il me semble que j'ai déjà dit que "C'est une faute grave"

  18. #38
    Futur Membre du Club
    Test insert delete
    pourquoi c est une faute grave?
    il faut que je l'utilise pour ne prendre que les enregistrement non utilisés

  19. #39
    Expert éminent sénior
    Voilà un test pour ceux qui aiment les triggers

    A) Sans trigger
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    lock table big_table in exclusive mode nowait
    /
    insert /*+ APPEND */ Into big_hist 
    Select * from big_table
    where owner = 'PUBLIC'
    /
    delete mni.big_table 
    Where owner = 'PUBLIC'
    /
    commit
    /


    B) Avec trigger
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Create Or Replace Trigger BD_Big_Table
    Before Delete
    On Big_Table
    For Each Row
    Begin
      insert into big_hist
          (owner, object_name, subobject_name, object_id, data_object_id, object_type, created, last_ddl_time, timestamp, status, temporary, generated, secondary)
        values
          (:old.owner, :old.object_name, :old.subobject_name, :old.object_id, :old.data_object_id, :old.object_type, :old.created, :old.last_ddl_time, :old.timestamp, :old.status, :old.temporary, :old.generated, :old.secondary); 
    End;
    /
    delete mni.big_table 
    Where owner = 'PUBLIC'
    /
    commit
    /


    Tkprof Sans trigger
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    delete mni.big_table
    Where owner = 'PUBLIC'
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.00          0          0          0           0
    Execute      1      6.83     158.51       9249       1866     274898      239616
    Fetch        0      0.00       0.00          0          0          0           0
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total        2      6.83     158.52       9249       1866     274898      239616
     
    insert /*+ APPEND */ Into big_hist
    Select * from big_table
    where owner = 'PUBLIC'
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.03          0          0          0           0
    Execute      1      1.62      21.23       7639      21577       1137      239616
    Fetch        0      0.00       0.00          0          0          0           0
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total        2      1.62      21.26       7639      21577       1137      239616


    Tkprof Avec trigger
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    delete mni.big_table
    Where owner = 'PUBLIC'
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.00          0          0          0           0
    Execute      1     27.34     197.61       7061      17665     993822      239616
    Fetch        0      0.00       0.00          0          0          0           0
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total        2     27.34     197.62       7061      17665     993822      239616
     
    INSERT INTO BIG_HIST (OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID,
      DATA_OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS,
      TEMPORARY, GENERATED, SECONDARY)
    VALUES
     (:B1 , :B2 , :B3 , :B4 , :B5 , :B6 , :B7 , :B8 , :B9 , :B10 , :B11 , :B12 ,
      :B13 )
     
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.02          0          0          0           0
    Execute 239663     12.51      81.02          5       3397     266709      239663
    Fetch        0      0.00       0.00          0          0          0           0
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total   239664     12.51      81.04          5       3397     266709      239663

    A parte les différences en temps CPU, et Elapsed, j'aime bien les 239663 exécutions pour insérerer 239616 lignes

  20. #40
    Expert éminent sénior
    Citation Envoyé par zico_pro Voir le message
    pourquoi c est une faute grave?
    ...
    Parce que skip n'est documenté; égal zéro contrôle ! Montre moi ou tu la trouves dans la documentation d'Oracle

    Citation Envoyé par zico_pro Voir le message
    ...il faut que je l'utilise pour ne prendre que les enregistrement non utilisés
    Tu n'a que verrouillé d'aborde les enregistrements que tu veut traiter. Point !