la durée de vie de la table temporaire
J'ai la procédure suivante:
CREATE PROCEDURE foo ()
SELECT * FROM fooBar INTO TEMP tempTable;
-- do something with tempTable here
DROP TABLE tempTable;
END PROCEDURE;
Ce qui se passe si une exception est prévue avant la CHUTE de la TABLE est appelé? Va tempTable être toujours là après foo sorties?
Si oui, toto a pu manquer la prochaine fois, il est appelé, parce que tempTable existerait déjà. Comment devrait être gérée.
EDIT: je suis en utilisant informix 11.5
OriginalL'auteur rouble | 2009-12-02
Vous devez vous connecter pour publier un commentaire.
Que d'autres ont dit, les tables temporaires dernière jusqu'à ce que vous les déposez explicitement ou la fin de la session.
Si la procédure stockée échoue parce que la table existe déjà, SPL génère une exception.
Vous pouvez traiter les exceptions par l'ajout d'une clause d'EXCEPTION-mais vous êtes dans une des plus baroques, pièces de SPL, d'une Procédure Stockée Langue.
Ici est légèrement modifié la version de votre procédure stockée qui génère une division par zéro exception (SQL -1202):
Cela montre que la première fois par le code exécuté la sélection, la création de la table, et puis a couru sous le coup de la diviser par zéro. La deuxième fois, cependant, le SELECT a échoué car le temp de la table existe déjà, d'où le message d'erreur différents.
Au début/FIN de bloc les limites de la gestion des exceptions pour les bulles d'instruction. Sans le point de début/FIN, la gestion des exceptions couvre l'ensemble de la procédure, en réaction à l'erreur de division par zéro (et donc de laisser le DROP TABLE de travail et la procédure semble fonctionner correctement).
Noter que temptable existe encore à ce point:
Cela montre que la procédure n'échoue plus parce que la table temporaire est présent.
Vous pouvez limiter le bloc d'EXCEPTION à certains codes d'erreur (-958 semble plausible pour celle-ci) par:
Voir IBM Informix Guide de SQL: Syntaxe manuel, chapitre 3 " SPL des États.
Noter que Informix 11.70 ajouté le 'SI' et 'if not EXISTS' clauses de CRÉER et de DROP. Ainsi, vous pouvez utiliser de la modification de la DROP TABLE déclaration:
Ainsi, avec Informix 11.70 ou plus tard, de la façon la plus simple d'écrire la procédure est la suivante:
Vous pouvez également utiliser ce, mais alors vous obtenez la définition précédente de la procédure, quelle qu'elle soit, et il pourrait ne pas être ce que vous attendiez.
OriginalL'auteur Jonathan Leffler
Selon la documentation, les tables temporaires sont supprimées lorsque la session se termine.
Je suis entré "vérifier si la table existe" code pour vérifier avant de créer et de déposer. Ne Informix avoir une table temp structure dans laquelle une table ne peut être vu par la session de formation? SQL Server dispose de cette fonctionnalité.
OriginalL'auteur Jordan Ryan Moore
J'ai finalement utilisé une variante de Jonathan et RET de la solution:
Notez que moderne Informix prend en charge la SI il EXISTE et SI n'EXISTE PAS de clauses dans les énoncés comme DROP TABLE. Ainsi, ces jours-ci, vous pourriez écrire:
DROP TABLE IF EXISTS tempTable;
qui va tomber de la table si elle est présente (et vous avez la permission, etc) et ne rien faire si la table n'existe pas.OriginalL'auteur rouble
Oui, la table temp existe toujours. Des tables temporaires, par définition, ont une durée de vie de la session, sauf s'il est explicitement abandonné.
La table temporaire ne peut être vu par la session qui l'a créé, et il n'y a aucun obstacle à la même procédure en cours d'exécution en parallèle par plusieurs utilisateurs. Adam de la réponse de tester l'existence de la table temporaire sera de retour à un résultat non nul si un utilisateur exécute la procédure. Vous avez besoin de tester que la session qui est propriétaire de la table temporaire est la session en cours. Étant donné que cette question est dans le cadre d'une procédure stockée, il pourrait être plus simple pour ajouter une explicite BAISSE, enveloppés dans une gestion d'exception.
OriginalL'auteur RET
Si w_count est de 1, supprimer la table avant de SÉLECTIONNER ... DANS le. Même avec DROP TABLE.
OriginalL'auteur adamcodes