PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Получавате размер на голям обект в заявка на PostgreSQL?

Не че съм използвал големи обекти, но гледам документите:http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

Мисля, че трябва да използвате същата техника, както изискват някои API на файлова система:потърсете до края, след това кажете позицията. PostgreSQL има SQL функции, които изглежда обвиват вътрешните C функции. Не можах да намеря много документация, но това работи:

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

Тестване:

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

Изглежда, че LO функционалността е проектирана да се използва предимно чрез клиента или чрез сървърно програмиране на ниско ниво, но поне те са предоставили някои видими функции на SQL за нея, което прави горното възможно. Направих заявка за SELECT relname FROM pg_proc where relname LIKE 'lo%' за да започна. Неясни спомени от програмирането на C и малко проучване за режима x'40000'::int и SEEK_END = 2 стойност бяха необходими за останалото!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извикването на съхранена функция или процедура няма да вмъкне и да запази промените

  2. Поправяне на повредена TOAST маса

  3. Разрешеният размер на паметта от 8589934592 байта е изчерпан

  4. Oracle към PostgreSQL:ANSI външен синтаксис на присъединяване в PostgreSQL

  5. Извършване на промени в топологията на репликация за PostgreSQL