Không phải là tôi đã sử dụng các đối tượng lớn, nhưng nhìn vào tài liệu: http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL
Tôi nghĩ rằng bạn phải sử dụng kỹ thuật tương tự như một số API hệ thống tập tin yêu cầu: tìm cách cuối cùng, sau đó nói với vị trí. PostgreSQL có các hàm SQL xuất hiện để bọc các hàm C bên trong. Tôi không thể tìm thấy nhiều tài liệu, nhưng điều này đã làm việ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;
$$;
kiểm tra 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);
Có vẻ như các chức năng LO được thiết kế để được sử dụng chủ yếu là thông qua các khách hàng hoặc thông qua lập trình máy chủ cấp thấp , nhưng ít nhất họ đã cung cấp một số hàm có thể nhìn thấy SQL cho nó, điều này làm cho điều trên có thể xảy ra. Tôi đã truy vấn SELECT relname FROM pg_proc where relname LIKE 'lo%'
để bắt đầu. Những ký ức mơ hồ về lập trình C và một chút nghiên cứu cho chế độ x'40000'::int
và giá trị SEEK_END = 2
là cần thiết cho phần còn lại!
Vui lòng đọc hướng dẫn trước khi gửi bài như vậy một câu hỏi: http://www.postgresql.org/docs/current/static/functions.html –
Xác định "dữ liệu blob ". Một cột bytea'? Hoặc một đối tượng lớn được lưu trữ trong 'pg_largeobject'? Hiển thị định nghĩa bảng của bạn. –
Bản sao của [Lấy kích thước của lobject trong PostgresSQL] (http://stackoverflow.com/questions/9248738/obtaining-the-size-of-lobject-in-postgressql)? –