Oracle DBMS_LOB.WRITEAPPEND到Postgres的转换
有人能告诉我如何将下面的Oracle代码转换为Postgresql吗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
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()
-无需特殊函数