PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Konvertierung von Oracle DBMS_LOB.WRITEAPPEND in Postgres

Es hängt von der Größe Ihres großen Objekts ab. Wenn Ihre großen Objekte weniger als 500 MB groß sind, müssen Sie keine LOBs verwenden (PostgreSQL verwendet den Begriff LO), und Sie können einen text verwenden oder varchar type - die Arbeit ist ähnlich wie bei varchar . Ab dieser Größe sollten Sie LO API verwenden.

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)

Sie können also die LO-API verwenden, aber grundlegende Typen sollten bevorzugt werden. Die Grenzen für diese Typen sind normalerweise gut genug - und die Arbeit mit einfachen Typen ist viel komfortabler - mit einigen Möglichkeiten wie Volltext.