PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Obtenir la taille d'un objet volumineux dans la requête PostgreSQL ?

Non pas que j'ai utilisé de gros objets, mais en regardant les docs :http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

Je pense que vous devez utiliser la même technique que celle requise par certaines API de système de fichiers :rechercher jusqu'à la fin, puis indiquer la position. PostgreSQL a des fonctions SQL qui semblent envelopper les fonctions C internes. Je n'ai pas trouvé beaucoup de documentation, mais cela a fonctionné :

CREATE OR REPLACE FUNCTION get_lo_size(oid) RETURNS bigint
VOLATILE STRICT
LANGUAGE 'plpgsql'
AS $$
DECLARE
    fd integer;
    sz bigint;
BEGIN
    -- Open the LO; N.B. it needs to be in a transaction otherwise it will close immediately.
    -- Luckily a function invocation makes its own transaction if necessary.
    -- The mode x'40000'::int corresponds to the PostgreSQL LO mode INV_READ = 0x40000.
    fd := lo_open($1, x'40000'::int);
    -- Seek to the end.  2 = SEEK_END.
    PERFORM lo_lseek(fd, 0, 2);
    -- Fetch the current file position; since we're at the end, this is the size.
    sz := lo_tell(fd);
    -- Remember to close it, since the function may be called as part of a larger transaction.
    PERFORM lo_close(fd);
    -- Return the size.
    RETURN sz;
END;
$$; 

Le tester :

-- Make a new LO, returns an OID e.g. 1234567
SELECT lo_create(0);

-- Populate it with data somehow
...

-- Get the length.
SELECT get_lo_size(1234567);

Il semble que la fonctionnalité LO soit conçue pour être utilisée principalement via le client ou via une programmation de serveur de bas niveau, mais au moins, ils ont fourni certaines fonctions SQL visibles pour cela, ce qui rend ce qui précède possible. J'ai fait une requête pour SELECT relname FROM pg_proc where relname LIKE 'lo%' pour me lancer. De vagues souvenirs de programmation C et un peu de recherche pour le mode x'40000'::int et SEEK_END = 2 il fallait de la valeur pour le reste !