sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLクエリでラージオブジェクトのサイズを取得しますか?

    大きなオブジェクトを使用したわけではありませんが、ドキュメントを見てください:http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

    一部のファイルシステムAPIで必要とされるのと同じ手法を使用する必要があると思います。最後までシークしてから、位置を指定します。 PostgreSQLには、内部C関数をラップしているように見えるSQL関数があります。多くのドキュメントを見つけることができませんでしたが、これは機能しました:

    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. Oracleでのテーブル変更の監視

    2. 動的SQLクエリでテーブル名を設定するにはどうすればよいですか?

    3. isqlによるSQLの実行方法の変更

    4. Oracleでマテリアライズドビューを更新する方法