Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > InterBase
InterBase Forum d'entraide sur le SGBD InterBase de Codegear. Avant de poster -> F.A.Q Interbase, Tutoriels
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 21/03/2005, 12h29   #1
Invité de passage
 
Inscription : mars 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 5
Points : 1
Points : 1
Par défaut CONNECT BY dans InterBase

Bonjour

J'essaye de controler une table pour des cycles au niveau des données.

Je veux utiliser la commande SQL "CONNECT BY" dnas une procédure :
Code :
1
2
3
4
5
6
7
8
9
10
 
CREATE PROCEDURE PROCEDURE_VERIF_NOMENCLATURES
(ART_BASE_ID INTEGER)
AS
BEGIN
  SELECT ID, ART_ID, NOMENCLATURE_ID
  FROM ARTNOMENCLATURE_ART
  CONNECT BY ART_ID = PRIOR NOMENCLATURE_ID
  START WITH NOMENCLATURE_ID = :ART_BASE_ID;
END
J'ai un message d'erreur me disant que
Citation:
fmCompile.quCompile:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 7, char 9.
BY.
Si quelqu'un à un exemple ou une explication,...
NickoPier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 13h38   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Connect est utilisé dans isql pour se connecter à une base.
By c'est le mot clé que l'on trouve dans order by
start existe que sous firebird avec first afin de limiter le nombre d'enregistrement renvoyés.

Votre ordre ne marchera pas sous firebird/Interbase.

En plus si vous faites un select dans une procedure il vous faudra obligatoirement un INTO.

Je vous suggère de regarder le tuto sur ce site qui traite des procédures stockées.

Et je connais pas votre syntaxe et comprend pas bien ce que c'est sencé faire ? (Ce que je sais c'est que c'est pas dans les normes SQL, c'est un ajout malheureux qu'a fait ORACLE (ils auraient pu utiliser un autre mot clef tant qu a faire dans la nouveauté) et donc ce n'est dans les normes SQL. Je crois que ça à voir avec la récursivité mais j'en sais pas plus.
Donc je ne peux pas vous aider plus sans précision.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 13h40   #3
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Citation:
"CONNECT BY"


C'est du Oracle ça !?

Sous IB, CONNECT (sans BY) permet de se connecter à une BdD...
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 14h12   #4
Invité de passage
 
Inscription : mars 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 5
Points : 1
Points : 1
L'idées est de créer un arbre hiérarchique à partir d'une table.
Le contrôle d'erreur qui est supposé lié à la fonction "CONNECT BY" permettant de détecter les cycles.
Une autre opération devait ensuite supprimer la ligne nouvellement créée.
NickoPier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 15h05   #5
Membre régulier
 
Inscription : décembre 2004
Messages : 142
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 142
Points : 76
Points : 76
Un arbre hiérarchique ?

D'après le nom de ta table (Nomenclature) et si je puis me permettre, tu devrais peut-être aller voir :

http://sqlpro.developpez.com/cours/arborescence/

Pour la syntaxe, Barbibulle a répondu.
Vulcanos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 15h24   #6
Invité de passage
 
Inscription : mars 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 5
Points : 1
Points : 1
J'avais bien compris, c'était pour donner une idée plus claire du fonctionnement que je voulais obtenir.
Par contre, je ne peux pas modifier la structure de mes donnée.
NickoPier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 18h33   #7
Invité de passage
 
Inscription : mars 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 5
Points : 1
Points : 1
Voici un version qui fonctionne
Rappel rapide : le but est de détecter des cycles dans un arbres.

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
27
28
CREATE PROCEDURE PROCEDURE_VERIF_CYCLES (
    NOEUD_PRINCIPAL INTEGER,
    NOEUD_PARENT INTEGER)
RETURNS (
    BOUCLE INTEGER)
AS
DECLARE VARIABLE TMP_NOEUD_PARENT INTEGER;
DECLARE VARIABLE TMP_NOEUD_ACTUEL INTEGER;
BEGIN
BOUCLE = 1;
FOR SELECT NOEUD, PARENT
      FROM TABLE
      WHERE PARENT = :NOEUD_PARENT
      INTO :TMP_NOEUD_PARENT, :TMP_NOEUD_ACTUEL
DO
    BEGIN
      IF (:TMP_NOEUD_ACTUEL = :NOEUD_PRINCIPAL) THEN
      BEGIN
        BOUCLE = 0;
        EXIT;
      END
      ELSE
      BEGIN
        IF (NOT ((:TMP_NOEUD_PARENT IS NULL) OR (:TMP_NOEUD_ACTUEL IS NULL))) THEN
          EXECUTE PROCEDURE PROCEDURE_VERIF_NOMENCLATURES :NOEUD_PRINCIPAL, :TMP_NOEUD_ACTUEL RETURNING_VALUES BOUCLE;
      END
END
END
Le soucis est que la valeur de retour est toujours null que les valeurs de test soient bonnes ou mauvaises.
Le problème est résolu en ajoutant un controle avant l'appel récursif.
Merci pour les conseils.
NickoPier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 19h14   #8
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Il y a deux types de PS celles qui renvoient des ensembles de données et celles qui ne renvoient que des paramètres.

La première peut être utilisée dans des

Code :
SELECT * FROM MaProcedure('Toto',1,3) WHERE ...;
alors que la seconde revéera toujours null, pour lire les paramètres de retour il faut procéder autrement.

Vous vous doutez maintenant que vous êtes dans le second cas .

Pour que votre procédure retourne des valeurs de type enregistrements et non paramètres de retour, il suffit de placer un (ou plusieurs )
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2005, 19h39   #9
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Autres remarques vous n'êtes pas obligé de mettre les : devant les variables quand ce n'est pas dans un ordre SQL (ou execute procedure)
Ensuite sachez que Execute procedure n'attend qu'un seul enregistrement en retour.
Si votre procédure est suceptible d'en retourner plusieurs faite un
Code :
1
2
FOR SELECT ... FROM MaProcedure INTO :... Do 
Suspend;
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2005, 08h24   #10
Invité de passage
 
Inscription : mars 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 5
Points : 1
Points : 1
Merci pour les précisions.
Dans l'état actuel, la procédure me satisfait : je ne doit avoir qu'une seule version de la variable boucle, la PS étant basée sur le fait que les autres noeuds sont bien formé et que seul le premier est suceptible de former une boucle.
NickoPier 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 09h19.


 
 
 
 
Partenaires

Hébergement Web