sql >> Databáze >  >> RDS >> PostgreSQL

Získat velikost velkého objektu v dotazu PostgreSQL?

Ne že bych používal velké objekty, ale podívám se na dokumenty:http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

Myslím, že musíte použít stejnou techniku, jakou vyžadují některá rozhraní API souborového systému:hledejte do konce a poté sdělte pozici. PostgreSQL má funkce SQL, které se zdají obalovat vnitřní funkce C. Nemohl jsem najít mnoho dokumentace, ale toto fungovalo:

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

Testování:

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

Zdá se, že funkcionalita LO je navržena tak, aby byla používána většinou prostřednictvím klienta nebo prostřednictvím nízkoúrovňového programování serveru, ale alespoň pro ni poskytli některé viditelné funkce SQL, což výše uvedené umožňuje. Zadal jsem dotaz pro SELECT relname FROM pg_proc where relname LIKE 'lo%' abych mohl začít. Nejasné vzpomínky na programování v C a trochu výzkumu pro režim x'40000'::int a SEEK_END = 2 hodnota byla potřebná pro zbytek!



  1. Jak EXTRACT() funguje v MariaDB

  2. Vysvětlení složených jednotek data a času MariaDB

  3. Chyba syntaxe na konci vstupu v PostgreSQL

  4. Vrátí nečíselné hodnoty ze sloupce databáze PostgreSQL