PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Conversion Oracle DBMS_LOB.WRITEAPPEND vers Postgres

Cela dépend de la taille de votre gros objet. Lorsque vos objets volumineux font moins de 500 Mo, vous n'avez pas besoin d'utiliser des LOB (PostgreSQL utilise le terme LO), et vous pouvez utiliser un text ou varchar type - le travail est similaire à varchar . Après cette taille, vous devez utiliser l'API LO.

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)

Vous pouvez donc utiliser l'API LO, mais les types de base doivent être préférés. Les limites de ces types sont généralement assez bonnes - et le travail avec les types de base est beaucoup plus confortable - avec certaines possibilités comme le texte intégral.