Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/09/2008, 12h33   #1
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
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 :
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 13h24   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 13h58   #3
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 14h45   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 16h30   #5
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Je ne comprend pas où voulez-vous en venir mnitu
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 16h58   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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 ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 10h33   #7
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 11h32   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 12h52   #9
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
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 :
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 14h14   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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.) ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2008, 08h12   #11
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2008, 09h39   #12
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
Code :
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2008, 16h59   #13
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
C'est bizarre
Chez moi, il y a ces 2 lignes de plus

Citation:
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2008, 17h17   #14
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
Quelle version d'Oracle ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2008, 05h24   #15
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
J'utilise Oracle 9i release 2!!
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2008, 13h56   #16
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
Même version.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2008, 15h15   #17
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2008, 14h36   #18
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h01.


 
 
 
 
Partenaires

Hébergement Web