Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 28/03/2011, 14h59   #1
Membre du Club
 
Inscription : novembre 2003
Messages : 152
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : novembre 2003
Messages : 152
Points : 60
Points : 60
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 :
Citation:
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
hobotalker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 15h50   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 808
Points : 5 808
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/03/2011, 15h56   #3
Membre du Club
 
Inscription : novembre 2003
Messages : 152
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : novembre 2003
Messages : 152
Points : 60
Points : 60
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.
hobotalker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 16h16   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 445
Points : 10 445
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 16h24   #5
Membre du Club
 
Inscription : novembre 2003
Messages : 152
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : novembre 2003
Messages : 152
Points : 60
Points : 60
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.
hobotalker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 17h38   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
http://www.oracle.com/technetwork/da...1.html#1010_01
Citation:
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.
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/03/2011, 09h15   #7
Membre du Club
 
Inscription : novembre 2003
Messages : 152
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : novembre 2003
Messages : 152
Points : 60
Points : 60
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.
hobotalker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 09h37   #8
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
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 :
SELECT sys_guid() INTO :b FROM dual
puis
Code :
INSERT INTO t VALUES (:b)

Bon, le mieux serait de mettre à jour tes drivers et ta base, 8i date de plus de 10 ans
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h51.


 
 
 
 
Partenaires

Hébergement Web