sql >> Database teknologi >  >> RDS >> PostgreSQL

Få størrelsen på et stort objekt i PostgreSQL-forespørgsel?

Ikke at jeg har brugt store objekter, men ser på dokumenterne:http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

Jeg tror, ​​du skal bruge den samme teknik, som nogle filsystem-API'er kræver:søg til slutningen, og fortæl derefter positionen. PostgreSQL har SQL-funktioner, der ser ud til at ombryde de interne C-funktioner. Jeg kunne ikke finde meget dokumentation, men dette virkede:

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

Tester det:

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

Det ser ud til, at LO-funktionaliteten er designet til at blive brugt mest gennem klienten eller gennem lav-niveau serverprogrammering, men i det mindste har de givet nogle SQL-synlige funktioner til det, hvilket gør ovenstående muligt. Jeg lavede en forespørgsel efter SELECT relname FROM pg_proc where relname LIKE 'lo%' for at komme i gang. Vage minder om C-programmering og lidt research til tilstanden x'40000'::int og SEEK_END = 2 værdi var nødvendig for resten!



  1. SQLite MIN

  2. JSON_INSERT() vs JSON_SET() vs JSON_REPLACE() i SQLite

  3. PostgreSQL-sikkerhedskopimetodefunktioner i AWS S3

  4. Hvordan indsætter man en fil i Oracle-databasen?