PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pobrać rozmiar dużego obiektu w zapytaniu PostgreSQL?

Nie żebym używał dużych obiektów, ale patrząc na dokumentację:http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

Myślę, że musisz użyć tej samej techniki, której wymagają niektóre interfejsy API systemu plików:poszukaj do końca, a następnie podaj pozycję. PostgreSQL ma funkcje SQL, które wydają się owijać wewnętrzne funkcje C. Nie mogłem znaleźć dużo dokumentacji, ale to zadziałało:

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

Testowanie:

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

Wygląda na to, że funkcjonalność LO została zaprojektowana do użytku głównie przez klienta lub przez niskopoziomowe programowanie serwera, ale przynajmniej udostępniono dla niej pewne widoczne funkcje SQL, co umożliwia powyższe. Zrobiłem zapytanie dla SELECT relname FROM pg_proc where relname LIKE 'lo%' zacząć. Niejasne wspomnienia programowania w C i trochę badań dla trybu x'40000'::int i SEEK_END = 2 wartość była potrzebna dla reszty!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można połączyć się z serwerem Postgres w dockerze z zadokowanej aplikacji

  2. Czy usunięcie bazy danych nie musi odbywać się w żadnej transakcji?

  3. Postgresql json jak zapytanie

  4. Jak zaktualizować wiele kolumn w PostgreSQL

  5. java.lang.ClassNotFoundException:org.postgresql.Driver