SPI_exec

Nom

SPI_exec -- exécute une commande

Synopsis

int SPI_exec(const char * commande, int
nombre)

Description

SPI_exec lance la commande SQL spécifiée pour nombre lignes.

Cette fonction ne devrait être appelée qu'à partir d'une procédure connectée. Si nombre vaut zéro, alors elle va exécuter la commande pour toutes les lignes auxquelles elle s'applique. Si nombre est plus grand que 0, alors le nombre de lignes pour lesquelles la commande sera exécutée est restreint (très semblable à une clause LIMIT). Par exemple,

SPI_exec("INSERT INTO tab SELECT * FROM tab", 5);

autorisera au plus cinq lignes à être insérées dans la table.

Vous pouvez passer plusieurs commandes dans une chaîne et la commande peut être réécrite par des règles. SPI_exec retourne le résultat pour la dernière commande exécutée.

Le nombre réel de lignes pour lesquelles la (dernière) commande a été lancée est retourné dans la variable globale SPI_processed (sauf si la valeur de retour de la fonction est SPI_OK_UTILITY). Si la valeur de retour de la fonction est SPI_OK_SELECT, alors vous pouvez utiliser le pointeur global SPITupleTable *SPI_tuptable pour accéder aux lignes de résultat.

La structure SPITupleTable est définie comme suit :

typedef struct
{
    MemoryContext tuptabcxt;    /* contexte mémoire de la table de résultat */
    uint32      alloced;        /* nombre de valeurs allouées */
    uint32      free;           /* nombre de valeurs libres */
    TupleDesc   tupdesc;        /* descripteur de rangées */
    HeapTuple  *vals;           /* rangées */
} SPITupleTable;

valeurs est un tableau de pointeurs vers des lignes (le nombre d'entrées valables est donné par SPI_processed). tupdesc est un descripteur de ligne que vous pouvez passer aux fonctions SPI qui traitent des lignes. tuptabcxt, alloced et free sont des champs internes non conçus pour être utilisés par des routines SPI appelantes.

SPI_finish libère tous les SPITupleTables allouées pendant la procédure courante. Vous pouvez libérer une table de résultats donnée plus tôt, si vous en avez terminé avec elle, en appelant SPI_freetuptable.

Arguments

const char * command

chaîne contenant la commande à exécuter

int nombre

nombre maximum de lignes à traiter où à retourner

Valeur de retour

Si l'exécution de la commande a réussi, alors l'une des valeurs (positives) suivantes sera renvoyée :

SPI_OK_SELECT

si un SELECT (mais pas SELECT ... INTO) a été lancé

SPI_OK_SELINTO

si un SELECT ... INTO a été lancé

SPI_OK_DELETE

si un DELETE a été lancé

SPI_OK_INSERT

si un INSERT a été lancé

SPI_OK_UPDATE

si un UPDATE a été lancé

SPI_OK_UTILITY

si une commande utilitaire (c'est-à-dire CREATE TABLE) a été lancée

Sur une erreur, l'une des valeurs négatives suivante est renvoyée :

SPI_ERROR_ARGUMENT

si command est NULL ou count est inférieur à 0

SPI_ERROR_COPY

si COPY TO stdout ou COPY FROM stdin ont été tentés

SPI_ERROR_CURSOR

si DECLARE, CLOSE ou FETCH ont été tentés

SPI_ERROR_TRANSACTION

si BEGIN, COMMIT ou ROLLBACK ont été tentés

SPI_ERROR_OPUNKNOWN

si le type de commande est inconnu (ce qui ne devrait pas arriver)

SPI_ERROR_UNCONNECTED

si appel à partir d'une procédure non connectée

Notes

Les fonctions SPI_exec, SPI_execp et SPI_prepare changent à la fois SPI_processed et SPI_tuptable (juste le pointeur, pas le contenu de la structure). Sauvegardez ces deux variables globales dans des variables locales de procédures si vous voulez accéder aux résultats de SPI_exec ou SPI_execp sur plusieurs appels.