Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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/12/2006, 13h30   #1
Zay
Invité régulier
 
Inscription : décembre 2005
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 53
Points : 8
Points : 8
Par défaut [Oracle 9i/10g] PL/SQL

Salut tout le monde..
En fait,ayant un graphe orienté je veux chercher le plus court chemin entre 2 points. J'ai trouvé un code parfait sur internet (Building a Route Planner with Oracle SQL - Finding the quickest route in a graph by Lucas Jellema http://technology.amis.nl/blog/?p=1221) testé avec Oracle 10g.
J'ai voulu l'implémenter avec Oracle 9i mais j'ai des erreurs :
Tables :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE points
( id    number(5)
, name  varchar2(30)
)
/
 
CREATE TABLE connections
( from_id number(5)
, to_id   number(5)
, distance number(5)
)
/
View :
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE VIEW point_connections
AS
SELECT from_point.name from_point
,      to_point.name   to_point
,      conn.distance  distance
FROM   points from_point
,      connections conn
,      points to_point
WHERE  conn.from_id = from_point.id
AND    conn.to_id = to_point.id
/
Fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE 
FUNCTION  evaluate_string
( p_string IN varchar2
) RETURN number
IS
  l_result number;
begin
  execute immediate
    ’SELECT||p_string||FROM dual’
    INTO l_result;
  RETURN l_result;
end evaluate_string;
/
--> Avertissement : Fonction créée avec erreurs de compilation.

Pour tester la fonction :
Code :
1
2
3
SELECT evaluate_string('5*4')
FROM   dual
/
--> select evaluate_string('5*4')
*
ERREUR à la ligne 1 :
ORA-06575: Fonction EVALUATE_STRING est dans un état non valide

Le plus court chemin :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT graph.*
,      evaluate_string(graph.route_cost) distance
FROM ( SELECT level number_of_transfers
       ,      sys_connect_by_path(distance,'+') route_cost
       ,      CONNECT_BY_ROOT from_point||sys_connect_by_path(to_point,'/') route
       FROM   point_connections pc
       connect 
       BY     nocycle prior to_point = from_point
       start
       WITH   from_point = ‘A’  — starting point of the trip
     ) graph
WHERE regexp_like(route,’D$’) — D IS the final destination
ORDER
BY    distance
/
--> , CONNECT_BY_ROOT from_point||sys_connect_by_path(to_point,'/') route
*
ERREUR à la ligne 5 :
ORA-00923: Mot-clé FROM absent à l'emplacement prévu


Pouvez-vous m'aider???
Merci infiniment
Zay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 13h51   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Citation:
--> Avertissement : Fonction créée avec erreurs de compilation.
A ce moment, faites SHOW ERRORS pour voir le message d'erreur et la ligne en cause.
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 13h53   #3
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Ce sont les quotes qui sont mauvaises
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
CREATE OR REPLACE FUNCTION Evaluate_String
( p_string IN VARCHAR2
) RETURN NUMBER
IS
l_result NUMBER;
BEGIN
EXECUTE IMMEDIATE
'SELECT ' ||p_string||' FROM dual'
INTO l_result;
RETURN l_result;
END Evaluate_String;
/
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 14h11   #4
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Et pour ce qui est de la jolie requête récursive, malheureusement tout n'existe pas en 9i:

- CONNECT_BY_ROOT
- nocycle
- regexp_like



Cependant sys_connect_by_path existe, donc tu devrais pouvoir t'en sortir pour simuler le connecte_by_root (facilement...). Pour le nocycle, c'est plus embêtant, peut etre aussi en bidouillant une clause prior avec le sys_connect_by_path, sinon tu va devoir te faire une fonction récursive toi meme...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 15h42   #5
Zay
Invité régulier
 
Inscription : décembre 2005
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 53
Points : 8
Points : 8
Par défaut [Oracle 9i/10g]PL/SQL

Je ne crois pas que c'est un pblm de quotes car je les ai déjà corrigés et ça n'a rien changé!!!!
Merci pour votre aide dans tous les cas
Zay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 15h50   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est un problème de syntaxe en tout cas, donc que tu pourras résoudre probablement seul en lisant les erreurs remontées par la compilation
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 17h41   #7
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Attention au copier/coller tu n'as pas mis les mêmes caractères pour les cotes que SheikYerbouti. En tout cas j'ai testé à tout hasard chez moi, ça passe.

Si ça te fait toujours l'erreur, fait un "show error" pour en voir le détail.

Mais attention, je ne parle que de la fonction "Evaluate_String" pour le reste, tu vas devoir remanier completement le code pour le rentre compatible avec une base 9i
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h17.


 
 
 
 
Partenaires

Hébergement Web