Oracle DBMS_LOB.WRITEAPPEND到Postgres的转换

Oracle DBMS_LOB.WRITEAPPEND到Postgres的转换,oracle,postgresql,plpgsql,Oracle,Postgresql,Plpgsql,有人能告诉我如何将下面的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); EN

有人能告诉我如何将下面的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;
如果prodNum=1,则
DBMS|u LOB.WRITEAPPEND(pkgFilterNode,LENGTH(pkgFilter|u tab | |‘|‘|‘| | l | crlf),pkgFilter|u tab | | | | | | | l | crlf;
如果结束;

谢谢你的时间

这取决于大对象的大小。当您的大型对象小于500MB时,就不需要使用LOB(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)
创建或替换函数writeappend(oid,文本)
返回void作为$$
声明
茶叶含量;
fd-int;
开始
内容:=将_转换为($2,getdatabaseencoding());
fd:=lo_open(131072美元);
执行lo_lseek(fd,0,2);
如果长度(内容)为lowrite(fd,内容),则
引发异常“未写入所有内容”;
如果结束;
执行LOU关闭(fd);
结束;
$$语言plpgsql;
postgres=>选择lo_creat(-1);
┌──────────┐
│ 罗素│
╞══════════╡
│    20653│
└──────────┘
(1排)
postgres=>选择writeappend(20653,e'Hello\r\n');
┌─────────────┐
│ 写开销│
╞═════════════╡
│             │
└─────────────┘
(1排)
postgres=>选择writeappend(20653,e'Hello\r\n');
...
postgres=>选择convert_from(lou get(20653),getdatabaseencoding());
┌──────────────┐
│ 转换│
╞══════════════╡
│ 你好\r\n↵│
│ 你好\r\n↵│
│              │
└──────────────┘
(1排)

因此,您可以使用LO API,但应首选基本类型。这些类型的限制通常是足够好的——使用基本类型要舒服得多——有一些可能,比如全文。

这取决于大对象的大小。当您的大型对象小于500MB时,就不需要使用LOB(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)
创建或替换函数writeappend(oid,文本)
返回void作为$$
声明
茶叶含量;
fd-int;
开始
内容:=将_转换为($2,getdatabaseencoding());
fd:=lo_open(131072美元);
执行lo_lseek(fd,0,2);
如果长度(内容)为lowrite(fd,内容),则
引发异常“未写入所有内容”;
如果结束;
执行LOU关闭(fd);
结束;
$$语言plpgsql;
postgres=>选择lo_creat(-1);
┌──────────┐
│ 罗素│
╞══════════╡
│    20653│
└──────────┘
(1排)
postgres=>选择writeappend(20653,e'Hello\r\n');
┌─────────────┐
│ 写开销│
╞═════════════╡
│             │
└─────────────┘
(1排)
postgres=>选择writeappend(20653,e'Hello\r\n');
...
postgres=>选择convert_from(lou get(20653),getdatabaseencoding());
┌──────────────┐
│ 转换│
╞══════════════╡
│ 你好\r\n↵│
│ 你好\r\n↵│
│              │
└──────────────┘
(1排)

因此,您可以使用LO API,但应首选基本类型。这些类型的限制通常是足够好的——使用基本类型要舒服得多——有一些可能性,比如全文。

如果是
文本
列(或变量),只需使用
|
concat()
——如果是
文本
列(或变量),则无需特殊函数,只需使用
|
concat()
-无需特殊函数