PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Nhận kích thước của đối tượng lớn trong truy vấn PostgreSQL?

Không phải tôi đã sử dụng các đối tượng lớn, nhưng đang xem 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 yêu cầu:tìm kiếm đến cùng, sau đó cho biết vị trí. PostgreSQL có các hàm SQL dường như bao 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 đã hoạt động:

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ư chức năng LO được thiết kế để sử dụng chủ yếu thông qua máy khách 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ố chức năng SQL hiển thị cho nó, điều này làm cho điều trên trở nên khả thi. Tôi đã thực hiện một truy vấn cho 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 về chế độ x'40000'::intSEEK_END = 2 giá trị cần thiết cho phần còn lại!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi cổng máy chủ vùng chứa postgres trong Docker Compose

  2. Khung khả dụng cao PostgreSQL tốt nhất là gì? PAF so với repmgr và Patroni Infographic

  3. pgFincore 1.2, một phần mở rộng PostgreSQL

  4. Làm thế nào để làm tròn đến X phút gần nhất với PL / pgSQL?

  5. Làm cách nào tôi có thể tạo ràng buộc để kiểm tra xem email có hợp lệ trong postgres hay không?