J'essaie de supprimer toutes les données relatives à un ID utilisateur à partir d'une base de données de jeu.
Il y a une table contenant tous les jeux (chacun joué par 3 joueurs): P>
ERROR: syntax error at "temp" DETAIL: Expected record variable, row variable, or list of scalar variables following INTO. CONTEXT: compilation of PL/pgSQL function "pref_delete_user" near line 3
3 Réponses :
Vous pouvez créer la table temporaire, puis faire l'insertion habituelle Il y a aussi un Comme option de création de table si vous souhaitez dupliquer la structure d'une table: p> < BlockQuote>
Mais je pense que vous avez juste besoin d'une table temporaire pour contenir des identifiants afin que cela soit probablement surchargé. p> [...] Cette forme de sélection est non disponible dans ECPG ou PL / PGSQL, car elles interprètent la clause différemment. P>
blockQuote> Le résultat d'une commande SQL produisant une seule ligne (éventuellement de plusieurs colonnes) peut être affecté à une variable d'enregistrement, à une variable de type ligne ou à une liste de variables scalaires. Ceci est fait en écrivant la commande SQL de base et en ajoutant un ... Sélectionnez CODE> comme opérations distinctes:
comme parent_table [similaire_option ...] code>
La clause comme code> spécifie une table à partir de laquelle la nouvelle table copie automatiquement tous les noms de colonnes, leurs types de données et leurs contraintes non nuls. P>
blockQuote>
Sélectionnez-vous dans CODE> fonctionne comme vous vous attendez à extérieur em> une procédure : p>
Sélectionnez dans code> est utilisé pour stocker le résultat d'une sélection dans une variable locale à l'intérieur d'une procédure postgreSQL : p>
dans la clause code>. P>
blockQuote> p>
Merci! Ai-je besoin de commettez-vous lorsque vous créez une table temporaire ici à l'intérieur de ma procédure?
@Alexander: ne pouvait pas faire mal, mais vous voudrez envelopper les tripes de la procédure dans une transaction (que vous voulez probablement faire quand même si vous faites un groupe de nettoyage et que vous ne voulez pas quitter le travail à moitié effectué).
@Muistooshort Que voulez-vous dire par "envelopper les tripes de la procédure dans une transaction"?
@Erwin: une seule procédure appelle-t-elle une transaction? Sinon, il pourrait avoir une moitié de nettoyage de la moitié si l'une des suppressions a échoué.
@Muistooshort: Le corps d'une fonction est Toujours B> exécuté comme une transaction: tout réussit ou tout échoue. Pas besoin d'une transaction explicite.
@Muistooshort: Vous pouvez utiliser Dblink si vous avez besoin de modifications pour être permanentes et non roulées sur une erreur. (C'est pas b> ce que vous voulez habituellement - et non de ce que vous parliez ici. Juste pour un souci de complétude). Consultez cette entrée dans le Wiki Postgresql .
@Erwin: Merci, je n'ai jamais eu besoin de prendre soin de l'une des procédures que j'ai écrites, donc je n'ai jamais eu besoin de le chercher. Donc, sur commettre baisse, c'est probablement une bonne idée?
@ALEXANDER: Vous pourriez être intéressé par le retour et venir avec Erwin sur les transactions. Je dirais maintenant «Oui, vous voulez probablement que vous souhaitiez commettre une baisse de la table temporaire».
Vous pouvez essayer
En plus de créer explicitement une table temporaire puis de l'insérer, il y a un autre, plus simple, em> strong> moyen de le faire: Cette commande est fonctionnellement similaire à pour postgres 9.1 ou ultérieur fort> voir ci-dessous. p> Il serait également plus efficace d'utiliser Mettre tout ensemble, Votre fonction pourrait ressembler à ceci: p> dans la journée moderne postgres ce qui précède n'a de sens que pour des opérations compliquées où vous avez besoin d'un Réelle em> table temporaire pour fonctionner avec - par exemple pour créer un index sur celui-ci avant de continuer. P> dans Postgres Créer une table TEMP Comme code> strong> comme Recommandé dans les docs A>:
Sélectionnez dans CODE>, mais c'est
préféré car il est moins susceptible d'être confondu avec d'autres utilisations de
Le
Sélectionnez dans la syntaxe CODE>. En outre,
créer une table comme code> offre un superset
de la fonctionnalité offerte par
Sélectionnez dans CODE>. P>
blockquote>
Supprimer .. code>
strong> au lieu d'une sous- Sélectionnez.
Et oui, si vous ne prévoyez pas de continuer à utiliser la table Temp (dans la même session) après que la transaction soit engagée, ajoutez sur validez goutte code>. P>
modifiant des données CTE H3>
Je voulais juste mentionner que j'ai vu des avantages remarquables de performances sur Postgres 8.3 à l'aide d'un tableau d'identifiants au lieu d'une table TEMP. Quelque chose comme Deleter_ids = tableau (sélectionnez ID de ... Où ...); Supprimer de TBL où gid = tout (Deleter_ids); code>
Sélectionnez dans CODE> a une signification différente dans PLPGSQL.
Oui merci, alors que d'utiliser ici à la place?