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

SQL Oracle Discussion :

[Oracle 8.1] INSERT avec sys_guid() + récupérer la clé primaire


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut [Oracle 8.1] INSERT avec sys_guid() + récupérer la clé primaire
    Bonjour à tous !

    Étant relativement à cours d'idées et ayant cherché sur le net en vain, je me tourne vers vous pour trouver une solution à mon problème. J'utilise le client Oracle 8.1 et je précise que "j'attaque" ma base de données via un client C# .NET 1.1, que je développe moi-même.

    Toutes les clés primaires de ma base sont générées via la fonction sys_guid(). J'aimerais pouvoir, dans la même requête que l'INSERT, récupérer la valeur de la clé primaire ainsi générée. J'ai donc cherché et découvert le mot clé RETURNING, permettant de renvoyer la valeur d'un champ donné dans une variable. J'obtiens malheureusement l'erreur suivante :
    Erreur commençant à la ligne 2 de la commande :
    insert into edb_har_prp_diff_movements values(sys_guid(), '9F88891A97A95437E044002128209653', 'Test', 'Test', 'Test', 'Test') returning MOVEMENT_ID INTO :var
    Erreur à la ligne de commande : 2, colonne : 0
    Rapport d'erreur :
    Erreur SQL : Violation de protocole
    Merci d'avance pour votre aide, cela fait plusieurs jours que je cherche une solution ! Je ne cherche pas forcément à passer par RETURNING, il me faut simplement un moyen de m'en sortir...

    J'espère à bientôt.
    Hobotalker

  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
    Je viens de vérifier et la clause returning existe au moinj en 8.1.7 donc votre problème est ailleurs.
    De toute façon il n’y pas de miracles, il faut chercher d’abord la valeur de la fonction sys_guid() et ensuite l’utiliser dans l’insert.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    Bonjour et merci de votre réponse.

    Je suis relativement (voire franchement) nul en SQL et aimerais éviter de passer par du code serveur.

    De quelle manière pourrais-je donc stocker cette valeur avant de l'envoyer?
    Comment expliquez-vous que le RETURNING ne fonctionne pas?

    Encore une fois, merci de votre aide.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par hobotalker Voir le message
    Toutes les clés primaires de ma base sont générées via la fonction sys_guid()
    Quelle idée farfelue, pourquoi faire simple quand on peut faire compliqué n'est-ce pas ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Quelle idée farfelue, pourquoi faire simple quand on peut faire compliqué n'est-ce pas ?
    La base existe déjà et je la récupère en l'état. Je n'ai donc pas le choix.

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    http://www.oracle.com/technetwork/da...1.html#1010_01
    8.1.7 (8i r2)
    Is DML Returning Supported ?

    Not in the current drivers. However, we do have plans to support it in post 8.1.7 drivers.

    10.2.0 (10g r2)
    Is DML Returning Supported ?

    YES! And it's about time. See the Developer's Guide for details.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    Bonjour M. Schneider,

    Très bien, le RETURNING ne fonctionne pas dans ma version d'Oracle (le premier intervenant semblait croire le contraire, il me semble). Comme je l'ai dit auparavant, je ne suis pas fixé sur cette "fonction"; je cherche, encore une fois, une solution à mon problème.

    J'en suis actuellement à faire un SELECT assez peu catholique (pour ne pas dire absolument dégueulasse) à la suite de l'INSERT pour essayer de récupérer la ligne nouvellement générée. Cette solution ne me convient pas, et j'aurais aimé savoir s'il était possible d'y remédier.

    A bientôt, peut-être.

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Le RETURNING fonctionne dans 8i en sqlplus, mais pas avec les drivers odbc/jdbc.

    Pour avoir le sys_guid, il faut donc faire un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sys_guid() into :b from dual
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into t values (:b)

    Bon, le mieux serait de mettre à jour tes drivers et ta base, 8i date de plus de 10 ans

Discussions similaires

  1. [OCILIB] [OCI] Oracle INSERT avec clause RETURNING ROWID
    Par agileone dans le forum Interfaces de programmation
    Réponses: 0
    Dernier message: 01/05/2014, 14h58
  2. insertion avec forms 10G d'oracle
    Par sanouphil dans le forum Oracle
    Réponses: 3
    Dernier message: 12/11/2010, 08h39
  3. Récupérer les erreurs Oracle pendant les insert/update/delete
    Par robinson50 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 05/03/2009, 11h44
  4. [Oracle] Insert avec récupération valeur de la cle
    Par Silvia12 dans le forum Oracle
    Réponses: 2
    Dernier message: 11/03/2006, 03h28
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

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