Précédent   Forum des professionnels en informatique > Bases de données > Sybase > Adaptive Server Enterprise
Adaptive Server Enterprise Forum d'entraide concernant Sybase Adaptive Server Enterprise, le dataserver phare de Sybase
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/09/2007, 14h52   #1
Nouveau Membre du Club
 
Patrick LAXTON
Développeur informatique
Inscription : mai 2006
Messages : 35
Détails du profil
Informations personnelles :
Nom : Patrick LAXTON
Âge : 27
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 35
Points : 25
Points : 25
Envoyer un message via MSN à tosprou Envoyer un message via Skype™ à tosprou
Par défaut [ASE]Syntaxe curseur sur procédure stockée

Coucou!
C'est encore moi!
Suite à mon épisode des tables proxy (qui n'est toujours pas résolu, soit dit en passant), j'ai un problème de curseur dans un trigger.
Voilà les fautifs :
Code :
1
2
3
4
5
6
7
DECLARE UtilCurs CURSOR  
FOR
CALL PPPUTILL_IDPERI (@id_peri)
 
DECLARE ClientCurs CURSOR  
FOR
CALL PPPCLIENTL_IDPERI (@id_peri_util)
interactive SQL est assez gentil pour me balancer l'erreur suivante :
Code :
1
2
3
Impossible d'exécuter l'instruction.
Syntax error near 'Call'
...
Ces déclarations de curseurs ont lieu dans la création d'un curseur.
Le-dit curseur provient de l'une des bases de données ASA que je migre sous ASE.
Il a été écrit en Watcom-SQL, que je convertit à la main en Transact-SQL (rassurez-vous, c'est que les 8 triggers, parceque les 250 procs stockées étaient écrites en T-SQL, même si le T-SQL d'ASA et celui d'ASE sont incompatibles ).
J'ai évidemment essayé de remplacer le CALL par un EXEC, un EXECUTE, un SELECT, avec et sans les parenthèses, mais rien n'y fait.
Alors, si vous connaissez la syntaxe correcte pour déclarer un curseur sur une procédure stockée en T-SQL chez ASE, je vous aime .
Si vous savez comment l'utiliser aussi (mais pour ça, j'ai trouvé la syntaxe (normalement... Evidemment j'ai pas testé vu que la déclaration foire...)).

Merci d'avance!

P.S. : j'ai cherché sur la doc Sybase (), google, et les FAQ et forum Sybase du présent site.
P.S.2 : je suis tombé plusieurs fois, pendant mes recherches google, sur un blog ventant que le transfert d'ASA à ASE était facile ( http://mfinkelsztejn.monblogue.branchez-vous.com/ ). J'ai essayé de commenter l'article, mais je n'ai pas pu a cause d'une vieille foirade serveur. Il met un lien vers fadace.developpez.com/sgbdcmp . Si tu le connais, il serait peutêtre judicieux de lui faire changer son article? D'après l'équipe de chez Sybase qui s'occupe de nous, le transfert ASA => ASE est une première (dont nous sommes les heureux gagnants ), donc ça n'a jamais été testé, donc dire que c'est facile est un argument... Commercial...
tosprou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2007, 17h22   #2
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Il y a de nombreuses différences entre ASA et ASE... comme tu le voit!

Sous ASE il n'est pas possible d'ouvir un curseur sur le retour d'une proc.

Normallement on passe par une table temporaire, ou alors par une table proxy mappée sur la proc (solution lente et à priori à éviter à mon avis).

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 08h58   #3
Nouveau Membre du Club
 
Patrick LAXTON
Développeur informatique
Inscription : mai 2006
Messages : 35
Détails du profil
Informations personnelles :
Nom : Patrick LAXTON
Âge : 27
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 35
Points : 25
Points : 25
Envoyer un message via MSN à tosprou Envoyer un message via Skype™ à tosprou
Merci pour la réponse, je vais essayer avec la table temporaire...


Au passage, et pour m'éviter de créer un autre thread, je me suis apperçu qu'il m'était imposible de créer une table temporaire dans une fonction (c'est un problème qui n'a rien a voir avec le premier post de cette discussion : je le rapelle, je m'amuse à migrer la base entière).

Je vois bien comment contourner le problème, soit en créant une proc stockée qui fait la même chose que la fonction (c'est moche), soit en remplaçant la table temporaire (sur laquelle est basé tout l'algorithme de la fonction ) par un système de set_appcontext - get_appcontext (la-dite table temporaire est constituée d'une colonne ID (int) et d'une autre lettre (char(1)), donc c'est faisable, même si une table plus complexe aurait été faisable aussi ), mais ça c'est encore plus moche, mais au moins je modifie que la fonction, et pas les procs qui l'appellent.

Donc si vous connaissez un moyen de faire accepter les tables temporaires dans les fonctions, vous êtes les bienvenus...
tosprou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 12h29   #4
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
La base ASE est en quelle version ?

Quel type de fonction ?

En général créé les tables temporaires en dehors des procs, comme ceci:
Code :
1
2
3
4
5
6
7
8
9
 
CREATE TABLE #foo (...)
go
CREATE proc utilise_foo
...
AS
...
-- code qui utilise la table #foo
...
C'est particulièrement utile lorsqu'on plusieurs procs qui font référence à la même table temporaire.

Je n'ai pas essayé, mais peut-être que si on créé la table temporaire en avance la fonction s'y retrouve.

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 14h39   #5
Nouveau Membre du Club
 
Patrick LAXTON
Développeur informatique
Inscription : mai 2006
Messages : 35
Détails du profil
Informations personnelles :
Nom : Patrick LAXTON
Âge : 27
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 35
Points : 25
Points : 25
Envoyer un message via MSN à tosprou Envoyer un message via Skype™ à tosprou
Merci, j'ai trouvé ce genre de conseil lors de mes périgrinations.


Le truc c'est que je me sers de la table temporaire que dans ma fonction, pas ailleurs, et il faut qu'elle siot réinitialisée à chaque rappel de la fonction.

Si je créée la table temporaire à l'extérieur de la déclaration de la fonction, elle sera pas déclarée pendant les appels à la fonction? Donc comment y accéder?

Ceci étant dit : je travaille sur Sybase ASE 15.0.2 (la dernière), et le type de fonction que j'essaie de créer est bien une fonction, pas une procédure stockée (fonctions utilisateurs, celles qui ont été rendues disponibles dans la version 15.0.2), du style :
Code :
1
2
3
4
5
6
7
8
CREATE FUNCTION MA_FONCTION(
    @MA_CHAINE varchar(50),
    @MON_ENTIER int
)
returns smallint
AS
begin
...
Au fait, depuis mes expériences en C, j'ai pris le parti de ne plus trop créer d'objets globaux (table temporaire à l'extérieur), parceque je finis toujours par m'y perdre...
tosprou 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 23h34.


 
 
 
 
Partenaires

Hébergement Web