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 :

RecupId via erreur transformation sqlserveur/Oracle


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Par défaut RecupId via erreur transformation sqlserveur/Oracle
    Bonjour,
    j'ai un programme qui fonctionne sur SQLServeur et j'aimerai le transformer de façon à le faire fonctionner sous Oracle 8i.

    L'idée est que dans SQLServeur, j'utilise un trigger pour récupérer l'id en lançant une erreur via un print
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER [MESSAGE_IDENTITE_ARTICLE] ON dbo.ARTICLE FOR INSERT AS
     
    DECLARE @@IDENTITE INT
    SELECT @@IDENTITE = INSERTED.[N_IDARTICLE] FROM INSERTED
    PRINT 'N_IDARTICLE='+REPLACE(STR(@@IDENTITE,10,0),SPACE(1),'')+';'
    Dans mon code (Delphi via ADO), je récupère l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ADOConnection.Errors.Count = 1 then ...
    Result := ADOConnection.Errors[0].Description;
    J'aimerai pourvoir faire la même chose en Oracle pour envoyer l'id dans le trigger de l'insertion afin de ne pas avoir à modifier l'ensemble de mes requetes d'insertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER OWNER.ARTICLETRIGGER1 before INSERT 
    ON OWNER.ARTICLE
    FOR EACH ROW 
    DECLARE
      NextVal Number;
    BEGIN
     Select SEQ_ARTICLE.NextVal into NextVal from dual;
     :new.N_IDArticle := NextVal;
    -- renvoi de NextVal
    END;

  2. #2
    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
    La solution consiste à récupérer la valeur de la séquence en utilisant insert into … returning…
    Si t’inserts toujours une seule ligne (insert into ...values...) tu peux utiliser dbms_application_info.set_client_info pour stocker la valeur dans le trigger et dbms_application_info.read_client_info pour la lire dans Delphi. Mais il faut aussi que ta connexion soit persistante.

  3. #3
    Membre confirmé
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Par défaut
    Je ne peux utiliser le returning puisque cela m'obligerai à modifier l'ensemble des requêtes de mon programme.
    Le but étant que ce soit le serveur de base de données qui me retourne la valeur.

    La 2ème solution semble être la bonne. (la connexion est persistante et je ne lancerai ma méthode de récup d'id que pour un insert d'un enregistrement).
    Si 2 insert arrivent en même temps, la valeur de dbms_application_info ne risque pas d'être ecrasée par la 2ème requête ?



    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
     
    CREATE TRIGGER OWNER.ARTICLETRIGGER1 before INSERT 
    ON OWNER.ARTICLE
    FOR EACH ROW 
    DECLARE
      NextVal Number;
    BEGIN
     Select SEQ_ARTICLE.NextVal into NextVal from dual;
     :new.N_IDArticle := NextVal;
      dbms_application_info.set_client_info(NextVal);
    END;
     
    CREATE FUNCTION app_info_wrapper RETURN VARCHAR2 IS
     x VARCHAR2(64); 
    BEGIN
      dbms_application_info.read_client_info(x);
      RETURN x;
    END app_info_wrapper;
    il ne me reste plus qu'a modifier mes triggers et à faire appel à ma fonction dans delphi
    select app_info_wrapper from dual

    merci de l'aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OC4J] Erreur connection a Oracle via http://localhost:8888/em
    Par dragonfly dans le forum Connexions aux bases de données
    Réponses: 1
    Dernier message: 04/09/2008, 14h47
  2. [Débutant(e)] Message d'erreur JDBC pour oracle
    Par krakatoe dans le forum JDBC
    Réponses: 1
    Dernier message: 14/09/2005, 16h44
  3. fonction LAG et erreur PLS-00103. Oracle 8i
    Par henrirobert dans le forum Oracle
    Réponses: 7
    Dernier message: 26/05/2005, 16h03
  4. [Forms 6i] FRM-40502 : erreur Forms ou Oracle ?
    Par macben dans le forum Forms
    Réponses: 11
    Dernier message: 01/12/2004, 17h16
  5. [CR] erreur de driver oracle
    Par cdu dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 10/09/2004, 15h36

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