Преобразование Oracle DBMS_LOB.WRITEAPPEND в Postgres - PullRequest
0 голосов
/ 06 ноября 2018

Может кто-нибудь, пожалуйста, дайте мне знать, как преобразовать приведенный ниже код Oracle в Postgresql

IF prodNum = 1 THEN
          DBMS_LOB.WRITEAPPEND(pkgFilterNode, LENGTH(pkgFilter_tab || '<PackageFilters isNewFormat="Y" > '||l_crlf), pkgFilter_tab || '<PackageFilters isNewFormat="Y" > '||l_crlf);
END IF;

Цените свое время!

1 Ответ

0 голосов
/ 06 ноября 2018

Это зависит от размера вашего большого объекта. Когда ваши крупные объекты меньше 500 МБ, вам не нужно использовать большие объекты (PostgreSQL использует термин LO), и вы можете использовать тип text или varchar - работа аналогична varchar. После этого размера вы должны использовать LO API.

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, но предпочтительнее использовать базовые типы. Ограничения для этих типов обычно достаточно хорошие - и работа с базовыми типами намного удобнее - с некоторыми возможностями, такими как полный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...