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

OracleDBMS_LOB.WRITEAPPENDからPostgresへの変換

    大きなオブジェクトのサイズによって異なります。ラージオブジェクトが約500MB未満の場合、LOBを使用する必要はなく(PostgreSQLではLOという用語を使用)、textを使用できます。 またはvarchar タイプ-作業はvarcharと同様です 。このサイズの後は、LOAPIを使用する必要があります。

    CREATE OR REPLACE FUNCTION writeappend(oid, text)
    RETURNS void AS $$
    DECLARE
      content bytea;
      fd int;
    BEGIN
      content := convert_to($2, getdatabaseencoding());
      fd := lo_open($1, 131072);
      PERFORM lo_lseek(fd, 0, 2);
      IF length(content) <> lowrite(fd, content) THEN
        RAISE EXCEPTION 'not all content was written';
      END IF;
      PERFORM lo_close(fd);
    END;
    $$ LANGUAGE plpgsql;
    
    postgres=> select lo_creat(-1);
    ┌──────────┐
    │ lo_creat │
    ╞══════════╡
    │    20653 │
    └──────────┘
    (1 row)
    
    postgres=> select writeappend(20653, e'Hello\r\n');
    ┌─────────────┐
    │ writeappend │
    ╞═════════════╡
    │             │
    └─────────────┘
    (1 row)
    
    postgres=> select writeappend(20653, e'Hello\r\n');
    ...
    
    postgres=> select convert_from(lo_get(20653),getdatabaseencoding());
    ┌──────────────┐
    │ convert_from │
    ╞══════════════╡
    │ Hello\r     ↵│
    │ Hello\r     ↵│
    │              │
    └──────────────┘
    (1 row)
    

    したがって、LO APIを使用できますが、基本的なタイプを優先する必要があります。これらのタイプの制限は通常十分であり、基本的なタイプでの作業ははるかに快適ですが、フルテキストなどのいくつかの可能性があります。




    1. OracleSQLRegexが期待される結果を返さない

    2. 階層的に定義されたデータセットのフラット化されたテーブル/ビューの作成

    3. UNIONALLと組み合わせたテーブルのVIEWのMySQLパフォーマンス

    4. JavaのSQLUPDATEステートメントの影響を受ける行数を返します