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.