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

Oracle Discussion :

[C/PLSQL] Appeler 1 procédure compilée en C dans un trigger


Sujet :

Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [C/PLSQL] Appeler 1 procédure compilée en C dans un trigger
    Est-il possible d'appeler des procédures compilées en C dans les triggers, en particulier sur l'événement AFTER INSERT.
    Tout en sachant que dans ces procédures écrites en C, je voudrais lire et modifier la base de données dans le cadre de la session en cours (en cours dans le trigger), c'est-à-dire avant la fin de la transaction.

    Car j'ai un traitement assez complexe à réaliser dans mon trigger (déjà écrit en PL/SQL) mais je souhaite qu'il soit très performant.

    exemple complet de traitement (mais très simplifié) :

    /* cet exemple simule une relation de cle etrangere entre table1 et table2 avec creation automatique dans table2 suite à modification dans table1 et message d'erreur si suppression interdite */
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
      create table table1 ( id integer );
      create table table2 ( id integer, table1_id integer );
      create table table_log ( id integer, action varchar2(30), table_name varchar2(30) );
      -- trigger principal --
      create or replace trigger tg1 before insert or update or delete 
      on table1
      for each row 
      declare
      begin 
        if   inserting  then
          insert into table_log ( table_name, action, id ) values ( 'table1', 'insert', :new.id ) ;
        elsif  updating  then
          insert into table_log ( table_name, action, id ) values ( 'table1', 'update', :new.id ) ;    else
          insert into table_log ( table_name, action, id ) values ( 'table1', 'delete', :old.id ) ;
        end if ;
      end ;
      /
      -- trigger realisant la mise a jour dans la table etrangere (insert ou delete selon les cas)
      create or replace trigger tg2 after insert or update or delete
      on table1
      declare
        err  integer ;
        text  varchar2 ( 100 ) ;
        cursor  c1  is  
          select a.*, a.rowid 
          from table_log a 
          where  a.table_name = 'table1'
          order by a.rowid ;
        function  tester_table2(id integer)  return integer
        as
          cursor  c1  is  
            select table1_id 
            from table2 
            where table1_id = id ;
          rec1  c1%rowtype ;
        begin
          open c1 ;
          fetch c1  into  rec1 ;
          if   c1%found   then  
            return 1 ;  
          else     
            return 0 ; 
          end if ;
        end ;
      begin
        /*  partie a ecrire en C  */
        for rec1  in  c1  loop
          if rec1.action='delete'  then
            if  rec1.id  =  7  then
              err  :=  -20021 ;
            else
              delete table2 where table1_id=rec1.id ;
            end if ;
          elsif tester_table2(rec1.id)=0  then
            insert into table2 (table1_id) values ( rec1.id ) ;
          end if ;
          delete table_log where rowid=rec1.rowid ;
        end loop ;
        /*  fin de la partie a ecrire en C */
        if  err  <  0  then
          if  err  =  -20021  then
            text  :=  'suppression impossible dans ce cas ...' ;
          end if ;
          raise_application_error ( err, text ) ;
        end if ;
      end ;
    /* fin de l'exemple. */


    Merci de votre aide

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Il n'y a pas 36 solutions : soit vous faites du Pro*C et dans ce cas, le code est un programme client non stocké en base, sous vous faites des procédures stockées.
    Ces procédures stockées peuvent être écrites en PL/SQL ou en java, mais pas en C.

  3. #3
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    C'est possible depuis quelques releases. Le code externe appele peut etre du C ou du Java. Se reporter a la doc "Oracle® Database Application Developer's Guide - Fundamentals" pour plus d'info, part number B14251-01 pour 10gr2.

    A mon avis, si le traitement a effectuer a l'exterieur est principalement du procedural SQL, il sera bien plus rapide la ou il est, dans une procedure PL/SQL stockee.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Ces procédures stockées peuvent être écrites en PL/SQL ou en java, mais pas en C.
    Merci pour l'info. Je vais me pencher sur Java par conséquent.

  5. #5
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Sauf que j'avais dit une bêtise !
    que plabrevo a corrigé ! :-)

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/05/2008, 12h11
  2. Appel de Procédure stockée en ASP
    Par James85 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/11/2004, 17h55
  3. Appel de procédure par contenu de variable
    Par lil_jam63 dans le forum Langage
    Réponses: 9
    Dernier message: 13/09/2004, 08h05
  4. Appel de procédure dans une page ASP
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 02/04/2004, 16h59
  5. Appel de procédure...
    Par AmaX dans le forum Langage
    Réponses: 4
    Dernier message: 24/11/2002, 17h48

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