Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
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/11/2011, 08h48   #1
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 25
Points : 7
Points : 7
Par défaut [PRO*C] Problème de compilation

Bonjour,

J'ai une requête SQL fonctionnel, notamment sous Toad, mais qui ne complile en PRO*C.

J'ai déjà vu ce problème et il est lié apparament à une différence de version entre les langages SQL.

Maintenant, ayant récemmennt sorti de l'école et ayant une pauvre expérience du SQL je vous avoue que je suis perdu quand on me dit de revenir à une vielle version du langage, surtout que j'ai déjà du pas mal chercher pour obtenir cette requête fonctionnel.

Si vous pouvez m'aider j'en serais fortement reconnaissant. Juste me dire la technique à utiliser pour transformer la requête que voici :

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
 
	EXEC SQL WHENEVER SQLERROR DO OracleDBError();
 	EXEC SQL WHENEVER NOT FOUND CONTINUE;
 	EXEC SQL INSERT INTO rating_score_his 
 			(
 				person_idn,
          			rating_model,
          			model_var,
          			model_value,
          			rating_score_seq,
          			request_number,
          			last_update_user,
          			seq_num
                        )
   		SELECT person_idn,
          		rating_model,
          		model_var,
          		model_value,
          		rating_score_seq,
          		request_number,
          		last_update_user,
          		(SELECT nvl(max(seq_num), 0)+1
             			FROM rating_score_his
            			WHERE rating_score_his.person_idn = rating_score.person_idn
                  		AND rating_score_his.rating_model = rating_score.rating_model)
    		 FROM rating_score;
Où la partie suivante est le problème :

Code :
1
2
3
4
5
 
(SELECT nvl(max(seq_num), 0)+1
             			FROM rating_score_his
            			WHERE rating_score_his.person_idn = rating_score.person_idn
                  		AND rating_score_his.rating_model = rating_score.rating_model)
Merci beaucoup,
Albin Gilles.
AlbinOSG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 13h08   #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 813
Points : 5 813
Executez la requête via SQL dynamique.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 13h16   #3
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 25
Points : 7
Points : 7
Merci de votre réponse mais... Qu'est ce que cela veut dire?

J'ai trouvé des méthodes de SQL dynamique sur un papier oracle mais je vois pas en quoi cela m'aiderait.

Pour l'information, je transforme une requête qui utilisait un curseur pour effecter le travail mais qui prenait 50min pour insérer environ 900.000 lignes.

Merci beaucoup,
Albin.
AlbinOSG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 13h37   #4
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 813
Points : 5 813
En Proc*C vous pouvez exécuter des sql dynamique ; ça reviens à stocker votre requête dans une variable tableau des caractères et l'exécuter via des appels dynamiques. Normalement on utilise cette méthode pour exécuter des ordres sql qui changent en fonction de diverses conditions à l’exécution du programme. Mais, dans ce cas c'est juste une astuce pour empêcher le compilateur d'analyser une requête SQL ayant une syntaxe inconnue pour lui.
La documentation d'Oracle pour le Pro*C contient des explications et des exemples assez détaillés sur le SQL dynamique.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 14h09   #5
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 25
Points : 7
Points : 7
D'accord, merci beaucoup pour votre réponse. Je vais essayer ça de suite!

Albin.
AlbinOSG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 00h02   #6
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
La requete en question ne présente rien de particuliers (comme certaines expression analytiques non supportées par PRO*C)...

C'est quoi le message d'erreur ? Car il n'y a aucune raison que la requete ne passe pas..
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 08h34   #7
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 25
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 25
Points : 7
Points : 7
Bonjour,

Voici le message d'erreur :

Code :
1
2
3
4
5
6
7
8
Syntax error at line 123, COLUMN 21, file DeleteRating_AGI.pc:
Error at line 123, COLUMN 21 IN file DeleteRating_AGI.pc
                        (SELECT nvl(max(seq_num), 0)+1
....................1
PCC-S-02201, Encountered the symbol "nvl" when expecting one of the following:
 
   ( ) * + - / . @ | at, day, hour, minute, month, second, year,
The symbol "(" was substituted FOR "nvl" TO continue.
Et il fait le même genre d'erreur avec à peu près tous les symboles du SELECT en question.

Sinon, j'ai essayé via une méthode de SQL dynamique (la première selon la documentation d'oracle) et cela compile et s'exécute correctement. Donc un grand merci mnitu !

La requête ne fait pas exactement ce que je veux mais ca, c'est un autre problème .

Je passe en résolu mais si vous trouvez une solution au problème, c'est probablement mieux de pouvoir mettre la requête sans la méthode de SQL dynamique, sinon tant pis.

Encore merci,
Albin.
AlbinOSG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 13h23   #8
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 813
Points : 5 813
Citation:
Envoyé par Vincent Rogier Voir le message
La requete en question ne présente rien de particuliers (comme certaines expression analytiques non supportées par PRO*C)...

C'est quoi le message d'erreur ? Car il n'y a aucune raison que la requete ne passe pas..
Si, la sous-requête scalaire!
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h10.


 
 
 
 
Partenaires

Hébergement Web