9
votes

Utilisation de la table TEMP dans la procédure PL / PGSQL pour les tables de nettoyage

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


2 commentaires

Sélectionnez dans a une signification différente dans PLPGSQL.


Oui merci, alors que d'utiliser ici à la place?


3 Réponses :


13
votes

Vous pouvez créer la table temporaire, puis faire l'insertion habituelle ... Sélectionnez comme opérations distinctes: xxx

Il y a aussi un Comme option de création de table si vous souhaitez dupliquer la structure d'une table: < BlockQuote>

comme parent_table [similaire_option ...]
La clause comme 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.

Mais je pense que vous avez juste besoin d'une table temporaire pour contenir des identifiants afin que cela soit probablement surchargé.

Sélectionnez-vous dans fonctionne comme vous vous attendez à extérieur une procédure :

[...] Cette forme de sélection est non disponible dans ECPG ou PL / PGSQL, car elles interprètent la clause différemment.

Sélectionnez dans est utilisé pour stocker le résultat d'une sélection dans une variable locale à l'intérieur d'une procédure postgreSQL :

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 dans la clause .


8 commentaires

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 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 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».



1
votes

Vous pouvez essayer xxx


0 commentaires

14
votes

En plus de créer explicitement une table temporaire puis de l'insérer, il y a un autre, plus simple, moyen de le faire: Créer une table TEMP Comme comme Recommandé dans les docs :

Cette commande est fonctionnellement similaire à Sélectionnez dans , 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 . En outre, créer une table comme offre un superset de la fonctionnalité offerte par Sélectionnez dans .

pour postgres 9.1 ou ultérieur voir ci-dessous.

Il serait également plus efficace d'utiliser Supprimer .. 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 .

Mettre tout ensemble, Votre fonction pourrait ressembler à ceci: xxx

modifiant des données CTE

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 table temporaire pour fonctionner avec - par exemple pour créer un index sur celui-ci avant de continuer.

dans Postgres 9.1 ou ultraire Utilisez CTES de modification des données pour des cas simples comme celui qui est à la main : xxx


1 commentaires

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);