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 19/11/2007, 16h11   #1
Membre du Club
 
Inscription : mars 2002
Messages : 52
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : mars 2002
Messages : 52
Points : 43
Points : 43
Par défaut [ASE] Impossible de supprimer une table de type tempdb..matable

Bonjour,

voila je vous expose le probleme.

J'ai une procedure stockee qui créer une table de type temporaire

Code :
1
2
3
4
5
 
CREATE TABLE tempdb..matable
(
...
)
Cette table est doit perdurer après la fin de la procedure car elle est utilisée ailleurs, donc je n'utilise pas de table de type "#".

Lors du lancement d'une autre procedure (qui utilise le même nom de table), je commence par verifier l'existance de cette table, avec la commande suivante (comme ca si elle existe elle doit etre supprimée) :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE name = 'matable' AND type = 'U')
BEGIN
    DROP TABLE tempdb..matable
    SELECT @erreur = @@ERROR
    IF @erreur <> 0
    BEGIN
        PRINT 'CRD:KO DROP TABLE tempdb..matable - Erreur SYBASE N° : %1!', @erreur
        RETURN
    END
END
Sauf que lorsque ce code s'execute (dans la seconde procedure) la table n'est pas droppée.

Est ce que cela est du a un probleme connu de Sybase ou alors est ce un probleme de parametrage ou mieux encore est ce un probleme de syntaxe dans ma requete?

Je vous remercie par avance de vos réponses.

Citation:
Version de Sybase utilisée :
select @@version :
Adaptive Server Enterprise/12.5.1/EBF 11659 ESD#2/P/RS6000/AIX 4.3.3/ase1251/1838/32-bit/FBO/Fri Feb 20 06:56:30 2004
Malau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 17h01   #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
Est-ce qu'il y a un message d'erreur?

(une possibilité est que la table est "en utilisation", dans ce cas on ne peux pas la dropper)

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 19/11/2007, 17h13   #3
Membre du Club
 
Inscription : mars 2002
Messages : 52
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : mars 2002
Messages : 52
Points : 43
Points : 43
le message d'erreur est assez simple :
Code :
1
2
3
4
5
6
7
 
INSERT error: COLUMN name OR number of supplied VALUES does NOT match TABLE
definition.
(RETURN STATUS = -6)
 
 -------------------- -----------
 >> VALEUR DE @@error         213
En fait l'erreur donnée ci-dessus vient du fait que la table temporaire à un nombre de champ différent celon que je suis dans la premiere ou seconde procedure.

dans la premiere procedure la table comporte 13 colonnes et dans la seconde la table comporte 14 colonnes. Mais lors de l'appel de la seconde le code que j'ai donné ci-dessus pour verifier l'existance de la table et la dropper ne se fait pas. D'ou le code d'erreur de probleme d'insertion.
Malau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 17h36   #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
Attention - on ne peux pas dropper la table dans le même "batch" que celui ou on va exécuter un insert.

Donc:
Code :
1
2
3
4
5
6
7
8
 
IF object_id(ma_table) IS NOT NULL
    DROP TABLE ma_table
go
CREATE TABLE ma_table (...)
go
CREATE proc foo
...
Si il faut créer cette table dans une proc stockée alors il faudra peut-être recourir au SQL dynamique (execute immediate).

Comme cette table existe sous deux formes différente je pense qu'il faudrait revoir le design - j'utiliserai des noms de tables différents, ou alors si la table tempo doit simplement être visible sur la même connexion alors il suffit de pré-créer la table tempo avec le # avant l'exécution de la proc.

Par exemple:
Code :
1
2
3
4
5
6
7
 
CREATE TABLE #ma_table(...)
go
CREATE proc ma_proc ...
AS
...
INSERT #ma_table ...
Lorsque la proc termine la table #ma_table reste dispo tant qu'on est sur la même connexion.

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 21/11/2007, 11h13   #5
Membre du Club
 
Inscription : mars 2002
Messages : 52
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : mars 2002
Messages : 52
Points : 43
Points : 43
Merci je pense avoir compris la reponse du coup je me sert de la fonction exec(), ou j'ai mis la commande du DROP et cela fonctionne.

au cas ou je met quand même l'exemple de ce que j'ai fait.


Code :
1
2
3
4
5
6
7
8
9
10
11
 
IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE name = 'matable' AND type = 'U')
BEGIN
    exec("DROP TABLE tempdb..matable")
    SELECT @erreur = @@ERROR
    IF @erreur <> 0
    BEGIN
        PRINT 'CRD:KO DROP TABLE tempdb..matable - Erreur SYBASE N° : %1!', @erreur
        RETURN
    END
END
En tout cas merci mpeppler pour ton aide.
Malau 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 16h12.


 
 
 
 
Partenaires

Hébergement Web