Nicht, dass ich große Objekte verwendet habe, aber bei der Dokumentation suchen: http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL
Ich glaube, Sie die gleiche Technik verwenden müssen, da einige Dateisystem-APIs erfordern: versuchen, das Ende, dann sagen Sie die Position. PostgreSQL verfügt über SQL-Funktionen, die die internen C-Funktionen zu umbrechen scheinen. Ich konnte nicht viel Dokumentation finden, aber das funktionierte:
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;
$$;
Testing es:
-- 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);
Es ist die LO-Funktionalität scheint ist so konzipiert, vor allem durch den Kunden oder durch Low-Level-Server-Programmierung verwendet werden , aber zumindest haben sie einige SQL-sichtbare Funktionen für sie zur Verfügung gestellt, die das obige möglich machen. Ich habe eine Abfrage für SELECT relname FROM pg_proc where relname LIKE 'lo%'
gemacht, um mich selbst zu beginnen. Vage Erinnerungen an C-Programmierung und ein wenig Forschung für die Mode x'40000'::int
und SEEK_END = 2
Wert wurden für den Rest benötigt!
Bitte lesen Sie das Handbuch, bevor eine solche Frage Posting: http://www.postgresql.org/docs/current/static/functions.html –
definieren „Blob-Daten ". Eine Byteasäule? Oder ein großes Objekt in 'pg_largeobject' gespeichert? Zeigen Sie Ihre Tabellendefinition an. –
Duplizieren von [Erhalten der Größe des LOB-Objekts in PostgresSQL] (http://StackOverflow.com/Questions/9248738/Berechtigung-der-Size-Ob-Lobject-in-Postgressql)? –