sql >> Database >  >> RDS >> PostgreSQL

Grootte van groot object ophalen in PostgreSQL-query?

Niet dat ik grote objecten heb gebruikt, maar als ik naar de documenten kijk:http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

Ik denk dat je dezelfde techniek moet gebruiken als sommige bestandssysteem-API's vereisen:zoek naar het einde en vertel dan de positie. PostgreSQL heeft SQL-functies die de interne C-functies lijken in te pakken. Ik kon niet veel documentatie vinden, maar dit werkte:

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

Testen:

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

Het lijkt erop dat de LO-functionaliteit is ontworpen om voornamelijk via de client of via serverprogrammering op laag niveau te worden gebruikt, maar ze hebben er in ieder geval een aantal zichtbare SQL-functies voor geleverd, wat het bovenstaande mogelijk maakt. Ik heb een query gedaan voor SELECT relname FROM pg_proc where relname LIKE 'lo%' om zelf aan de slag te gaan. Vage herinneringen aan C-programmering en een beetje onderzoek voor de modus x'40000'::int en SEEK_END = 2 waarde was nodig voor de rest!



  1. Hoe UPDATE van SELECT te gebruiken in SQL Server

  2. Slaapstand configureren om Oracle's SYS_GUID() voor primaire sleutel te gebruiken

  3. APEX_ZIP Voorbeeld

  4. Toegang met Microsoft SQL Server – Importeer grote datasets met SSIS