IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

PL/SQL Oracle Discussion :

Emulation des pseudo-tables inserted/deleted


Sujet :

PL/SQL Oracle

  1. #1
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut Emulation des pseudo-tables inserted/deleted
    Bonjour,

    Je cherche comment avoir un équivalent des tables INSERTED/DELETED de SQL Server!
    En fait, j'essaie de traduire une instruction SQL Server de jointure entre la table DELETED et la table dont on supprime des lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM [TableEntity] WHERE ID IN (SELECT Ins.ID FROM [inserted] Ins , [TableEntity] Ent WHERE
    Dans mon cas, le dernier enregistrement inséré dans [inserted] qui m'intéresse
    Bien sur cette ligne est utilisée dans un trigger after delete! Je projette de créer alors une table avant cela pour contenir tous les :old
    Est-ce une bonne approche? Le problème c'est que table créée avec EXECUTE IMMEDIATE n'est pas reconnue dans cette requête (undeclared identifier)

    Autre idée générale

    Pour avoir une émulation totale des pseudo-tables Mssql, je pense à faire l'insertion dans une table temporaire avec les triggers FOR EACH ROW puis traiter la table résultante dans un trigger statement du même évènement.
    J'ai pas encore implémenté cette technique mais est-ce bon?
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    et si tu expliquais à ceux qui ne connaissent pas les pseudo-tables SQL Server, ce que tu veux faire ? Parce que personnellement, je ne comprends pas bien le but de la manoeuvre

  3. #3
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Désolé de m'être mal exprimé!
    Le but c'est de faire une table temporaire pour contenir les lignes supprimées grâce à un trigger pour traiter le tout à la fin dans un trigger instruction after delete
    Comment faire pour cette idée de table temporaire?

    Les pseudo-tables(inserted,deleted) de SQL Server sont des tables pour contenir les lignes mises à jour ou supprimées possèdant la même définition que la table sur laquelle le trigger est appliqué. Bref, c'est l'équivalent des :old et :new de Oracle.
    Sauf que SQL Server n'a pas de trigger For Each Row donc il enregistre les lignes d'abord dans ces pseudo-tables et traiter le tout dans le trigger à la fin de la requête. Remarquons qu'Oracle possède 2 types de base de trigger: instruction et ligne (for each row) tandis que SQL Server n'a que le trigger instruction qui se sert de INSERTED/DELETED pour récupérer des informations sur l’opération déclenchante
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par randriano Voir le message
    Désolé de m'être mal exprimé!
    Le but c'est de faire une table temporaire pour contenir les lignes supprimées grâce à un trigger pour traiter le tout à la fin dans un trigger instruction after delete
    Comment faire pour cette idée de table temporaire?
    ...
    http://asktom.oracle.com/tkyte/Mutate/index.html

  5. #5
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Je ne comprend pas où voulez-vous en venir mnitu
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par randriano Voir le message
    Je ne comprend pas où voulez-vous en venir mnitu
    Nul part. Mais il me semble que l’article en question décrit le mécanisme que vous cherchez. Laisser tomber le titre concernant la table « klingoniane ». Avez vous examiné le code de la section Case 2 ?

  7. #7
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    En effet, cet exemple (case 2) évoque une part de mon idée: utilisation d'un package contenant une table de TABLE%ROWTYPE

    Ce que je ne comprend pas c'est que dès
    SQL> insert into delete_demo_view values ( 1, sysdate, 'Hello' );
    1 row created.

    SQL> insert into delete_demo_view values ( 2, sysdate, 'Goodbye' );
    1 row created.


    la table delete_demo contient aussi 2 lignes

    C'est après
    SQL> delete from delete_demo_view;
    2 rows deleted.

    que son champ hidden_date la date courante

    Je suis encore débutant en Oracle et je me demande le sens de index by binary_integer dans "type array is table of delete_demo%rowtype index by binary_integer"

    _________________________________

    Ce que je cherche surtout c'est une table où je puisse faire une jointure et que je supprimerai après???
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par randriano Voir le message
    En effet, cet exemple (case 2) évoque une part de mon idée: utilisation d'un package contenant une table de TABLE%ROWTYPE
    ...
    Package ou table temporaire c’est un détail.
    Citation Envoyé par randriano Voir le message
    ...
    Ce que je ne comprend pas c'est que dès
    SQL> insert into delete_demo_view values ( 1, sysdate, 'Hello' );
    1 row created.

    SQL> insert into delete_demo_view values ( 2, sysdate, 'Goodbye' );
    1 row created.


    la table delete_demo contient aussi 2 lignes

    C'est après
    SQL> delete from delete_demo_view;
    2 rows deleted.

    que son champ hidden_date la date courante
    La table contient les données, la vue n’est que un select stockée dans la base.
    Citation Envoyé par randriano Voir le message
    Je suis encore débutant en Oracle et je me demande le sens de index by binary_integer dans "type array is table of delete_demo%rowtype index by binary_integer"
    L’accès aux éléments du tableau se fait par une valeur numérique (comme dans un array)

    Citation Envoyé par randriano Voir le message
    Ce que je cherche surtout c'est une table où je puisse faire une jointure et que je supprimerai après???
    Met une "temporary table" à la place du package.

  9. #9
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Citation Envoyé par mnitu
    Met une "temporary table" à la place du package.
    C'est ça mais comment faire, montrez moi svp!

    Une autre question: je me demande c'est quoi ces 2 derniers affichages

    DELETE_DEMO_BD
    DELETE_DEMO_DBFER
    DELETE_DEMO_DBFER
    DELETE_DEMO_AD
    DELETE_DEMO_AD it-1
    DELETE_DEMO_AD it-2

    2 rows deleted.

    DELETE_DEMO_BD
    DELETE_DEMO_AD


    0 rows deleted.


    En fait, j'ai placé des dbms_output dans les triggers
    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
    28
    29
    30
    31
    create or replace trigger delete_demo_bd
        before delete on delete_demo
        begin
            dbms_output.put_line('DELETE_DEMO_BD');
            delete_demo_pkg.oldvals := delete_demo_pkg.empty;
        end;
    /
    create or replace trigger delete_demo_bdfer
        before delete on delete_demo
        for each row
        declare
            i    number default delete_demo_pkg.oldvals.count+1;
        begin
            dbms_output.put_line('DELETE_DEMO_DBFER');
            delete_demo_pkg.oldvals(i).a := :old.a;
            delete_demo_pkg.oldvals(i).b := :old.b;
            delete_demo_pkg.oldvals(i).c := :old.c;
       end; 
    /
    create or replace trigger delete_demo_ad
        after delete on delete_demo
        begin
            dbms_output.put_line('DELETE_DEMO_AD');
            for i in 1 .. delete_demo_pkg.oldvals.count loop
                dbms_output.put_line('DELETE_DEMO_AD it-' || i);
                insert into delete_demo ( a, b, c, hidden_date )
                values
                ( delete_demo_pkg.oldvals(i).a, delete_demo_pkg.oldvals(i).b,
                  delete_demo_pkg.oldvals(i).c, sysdate );
            end loop;
       end;
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par randriano Voir le message
    C'est ça mais comment faire, montrez moi svp!
    Il y a un exemple ici (quoi que en dépit d'avoir l'air de marcher cette solution ne marche pas).

    Citation Envoyé par randriano Voir le message
    Une autre question: je me demande c'est quoi ces 2 derniers affichages
    ...
    Peux tu poster un exemple complet (create tables, insert, create triggers etc.) ?

  11. #11
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Peux tu poster un exemple complet (create tables, insert, create triggers etc.) ?
    En fait, je me demande seulement pourquoi les triggers se sont encore exécutés là. L'exemple c'est celui de ton lien mais avec ces dbms_output.put_line seulement!!
    ASKTOM - MUTATE.txt
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQL> delete delete_demo_view;
    DELETE_DEMO_BD
    DELETE_DEMO_DBFER -1
    DELETE_DEMO_DBFER -2
    DELETE_DEMO_AD
    DELETE_DEMO_AD it-1
    DELETE_DEMO_AD it-2
     
    2 ligne(s) supprimée(s).
    Désolé, mais je ne vois pas bien où est le problème.

  13. #13
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    C'est bizarre
    Chez moi, il y a ces 2 lignes de plus

    DELETE_DEMO_BD
    DELETE_DEMO_DBFER
    DELETE_DEMO_DBFER
    DELETE_DEMO_AD
    DELETE_DEMO_AD it-1
    DELETE_DEMO_AD it-2

    2 rows deleted.

    DELETE_DEMO_BD
    DELETE_DEMO_AD

    0 rows deleted.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  14. #14
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Quelle version d'Oracle ?

  15. #15
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    J'utilise Oracle 9i release 2!!
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  16. #16
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Même version.

  17. #17
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Même version.
    C'est bizarre, utilises-tu le même script que j'ai attaché à mon précédent post?

    Revenons à l'origine de ce thread (émulation des pseudo-tables): je vais finalement opter pour la table ordinaire que je vide à chaque BEFORE INSERT, insertion à chaque AFTER INSERT FOR EACH ROW
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  18. #18
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    J'y opte car j'ai besoin de faire un SELECT sur l'émulation de la table. J'avais pensé que le package avec une variable table va suffire mais on ne peut pas y faire un select si je ne me trompe pas !!
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

Discussions similaires

  1. Pseudo table Inserted et triger instead of
    Par Dschub dans le forum Développement
    Réponses: 4
    Dernier message: 10/04/2009, 16h42
  2. Exécuter des requètes d'insertion de table
    Par Kalion dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 19/01/2009, 15h12
  3. ADO.NET INSERT DELETE UPDATE refresh des composants graphic
    Par jeriko dans le forum Accès aux données
    Réponses: 5
    Dernier message: 15/01/2007, 15h17
  4. Question sur les tables inserted et deleted
    Par critok dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/06/2006, 22h03
  5. voir les tables virtuel deleted inserted
    Par berceker united dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/06/2006, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo