Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 02/06/2003, 10h39   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
Par défaut [DOC] et [procédure stockée]

Bonjour,

Vouala, j'ai deux petits problèmes :

1) Je dois être mal réveillé, ou c'est le WE qui était trop long, car je n'arrive pas à mettre la main sur la doc SQL interbase (pas la doc d'install, la doc EssQUelle !).

2) Je m'essaie aux procédures stockées, et mon premier code est rejeté dans IBconsole... ( 'to! ) Voici ce que j'ai écris :
Code :
1
2
3
4
5
6
CREATE PROCEDURE nb_acces_par_jour ( jour varchar(10) )
RETURNS ( nb_acces integer )
AS
BEGIN
    SELECT count(*) FROM TEST1 WHERE COL_DATE = :jour ;
END
Merci d'avance
nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 10h59   #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
Pour ce qui est des docs :ftp://ftpc.borland.com/pub/interbase...ib_b60_doc.zip
Un zip de 10.4 Mo contenant les principaux bouquins au format PDF indispensable pour être autonome...

Sinon ta procédure a un problème, tu ne renseignes jamais le paramètre de retour ....

CREATE PROCEDURE nb_acces_par_jour ( JOUR varchar(10) )
RETURNS ( NB_ACCES integer )
AS
BEGIN
select count(*) from TEST1 where COL_DATE = :JOUR INTO :NB_ACCES;
suspend; /*Si tu veux pouvoir récupérer le résultat comme pour un odre select */
END
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 11h06   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
Merci pour la doc, je l'avais déjà jéjà téléchargé en fait, mais je l'avais oublié dans un coin de mon disque dur ! ! !

Pour la procédure stockée, ça marche pas, IBconsole me dit :
Code :
1
2
SQL error code = -104
Unexpected end of command
Vu que je suis ultra-novice, je sais pas à quoi ça fait référence...
nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 11h21   #4
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
Oui tu n'as pas redéfini le Code qui précise à Interbase que tu as fini...
Par défaut ce code est le ;
donc dès qu'il le rencontre il essaye d'exécuter ce qui précéde..
ca marche tres bien pour les
Code :
1
2
3
SELECT a,b,c FROM AA;
INSERT .... ;
SELECT .... ;
Il va exécuter chaque ordre les un apres les autres sans problèmes.
Mais si tu lui envois :

Code :
1
2
3
4
5
6
7
CREATE PROCEDURE nb_acces_par_jour ( JOUR varchar(10) ) 
RETURNS ( NB_ACCES integer ) 
AS 
BEGIN 
SELECT count(*) FROM TEST1 WHERE COL_DATE = :JOUR INTO :NB_ACCES; 
suspend; /*Si tu veux pouvoir récupérer le résultat comme pour un odre select */ 
END
Il va essayer d'exécuter :

Code :
1
2
3
4
5
CREATE PROCEDURE nb_acces_par_jour ( JOUR varchar(10) ) 
RETURNS ( NB_ACCES integer ) 
AS 
BEGIN 
SELECT count(*) FROM TEST1 WHERE COL_DATE = :JOUR INTO :NB_ACCES;
D'où l'erreur...
Donc il faur redéfinir le ; provisoirement pour lui dire de ne pas exécuter dès le premier ; rencontré mais autre chose....

va remplacer le caractère de fin de commande par !!
donc essaye ceci :
Code :
1
2
3
4
5
6
7
8
9
10
 
SET Term !! ;
CREATE PROCEDURE nb_acces_par_jour ( JOUR varchar(10) ) 
RETURNS ( NB_ACCES integer ) 
AS 
BEGIN 
SELECT count(*) FROM TEST1 WHERE COL_DATE = :JOUR INTO :NB_ACCES; 
suspend; /*Si tu veux pouvoir récupérer le résultat comme pour un odre select */ 
END!!
SET term ; !!
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 11h28   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
WouaaA ! ! Génial, ça marche ! ! !


nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 11h33   #6
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
Heu, j'ai fais une autre version de ma procédure stockée, en essayant d'utiliser un compteur, mais ça marche pas non plus :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SET Term !! ; 
CREATE PROCEDURE nb_acces_par_jour ( jour varchar(10) )
RETURNS ( nb_acces integer )
AS
    DECLARE VARIABLE nb_acces integer;
BEGIN
    FOR
        SELECT * FROM TEST1 WHERE COL_DATE = :jour;
    DO
    BEGIN
        nb_acces = nb_acces + 1;
    END
    suspend;
END
SET term ; !!
nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 11h49   #7
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
Oui ton select count(*) est bien mieux...
Mais pour te corriger :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SET Term !! ; 
CREATE PROCEDURE nb_acces_par_jour ( JOUR varchar(10) ) 
RETURNS ( NB_ACCES integer ) 
AS 
DECLARE VARIABLE I integer; 
BEGIN 
  NB_ACCES = 0;
  FOR SELECT 1 FROM Test1 WHERE COL_Date = :JOUR INTO :i
  DO
    NB_ACCES = NB_ACCES +1;
  suspend;
END!! 
SET term ; !!
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 11h57   #8
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
Yes, ça passe (encore ! )
Par contre, lorsque j'appelle la procédure avec
Code :
execute procedure nb_acces_par_jour("16Mar2003");
elle renvoie simplement null, alors que si j'exécute la requète directement :
Code :
SELECT count(*) FROM TEST1 WHERE COL_DATE ="16Mar2003";
ça renvoie un nombre d'enregistrements...
C'est le même problème pour les deux procédures.
nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 12h06   #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
Si tu veux l'appeler par execute procedure (regarde mon commentaire sur la ligne suspend)..
Enlève la ligne suspend; et normalement tu pourras récupérer le résultat avec execute procedure. (Enfin je pense....)

Sinon si tu laisses la ligne suspend essaye d'exécuter l'odre SQL suivant (pas par execute procedure...)

Code :
SELECT NB_ACCES FROM nb_acces_par_jour('16Mar2003');
Ca devrait fonctionner...
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 13h26   #10
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
Merci encore , tout fonctionne avec un select !

Je vais pouvoir commencer à pousser un peu le chmilblic...
Par contre, le fait d'enlever suspend ne me permet pas de récupérer le résultat, mais ce n'est pas grave, puisque ça marche avec un select !
nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 13h33   #11
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
Citation:
Envoyé par nawac
Par contre, le fait d'enlever suspend ne me permet pas de récupérer le résultat, mais ce n'est pas grave, puisque ça marche avec un select !
Ah je ne peux pas t'aider sur ce coup la car je crois me souvenir que tu utilises un langage (Java il me semble) que je n'ai pas pratiqué avec Interbase...
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 14h49   #12
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
Certes, mais il se trouve que j'utilise pour cette partie de mon projet du PHP ! ! !
D'ailleurs, j'ai un problème : il faudrait que je puisse envoyer des procédures (CREATE PROCEDURE...) à partir du ouèb (d'un formulaire donc) mais ça ne marche pas... J'ai peur que cela ne soit pas possible :
une procédure stockée s'appelle à distance, mais peut-elle être aussi créée à distance ??
C'est un point crucial de mon projet...

PS : il serait peut-être mieu que je post ce message dans le forum PHP, mais j'ai bien peur qu'on me renvoie ici !
nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 15h03   #13
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
Ca je ne sais pas...
Ca va dépendre essentiellement des API interbase qui sont à ta disposition pour PHP... et là j'avoue... je ne connais pas...
Essaye le forum PHP.
Tu es certains que tu ais besoin de créer des procédures dynamiquement ?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 15h27   #14
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
Pour la création de procédure dynamique, oui.
Enfin bref, j'essaie du coté des PHPistes...

...et encore MERCI Barbibulle pour tes conseils et ton savoir, tu es Grand


nawac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 15h33   #15
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
arrete...
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 16h02   #16
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
Peux tu m'expliquer ton besoin de créer des procédures stockées dynamiquement ? (Si ce n'est pas un secret...)
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2003, 16h50   #17
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 33
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 33
Points : 10
Points : 10
Envoyer un message via ICQ à nawac Envoyer un message via AIM à nawac Envoyer un message via MSN à nawac
En fait, je suis toujours sur le même projet depuis deux mois (chui en stage...).
Le but est de créer un outil qui puisse analyser n'importe quel type de fichier log.

J'ai donc construit un convertisseur de fichier log en base de donnée (à l'aide d'un système d'expressions régulières et tout...) dans le but de bénéficier de la puissance du langage SQL pour l'analyse.

La deuxième étape est de créer une interface consultable de n'importe ou (donc web) qui permettrait d'analyser la base de données. Dans cette optique, il m'a été imposé deux manières de procéder :
1) possibilité de faire une demande ponctuelle (donc d'écrire une requète simple, en gérant les droits d'accès et les types de requètes - pas de drop par exemple)
2) 'programmation' d'analyses, qui pourront être exploitable facilement par la suite (donc PROCEDURES STOCKéES).

Vu que les fichiers log convertis changent régulièrement, et que l'utilisateur n'est pas sur la machine serveur, la création d'une procédure à partir de l'interface graphique s'impose comme un bon choix...
(enfin j'espère, parce que dans un mois mon exam dépendra de ce projet !)
nawac 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 14h07.


 
 
 
 
Partenaires

Hébergement Web