我们已经决定从PostgreSQL 9.0数据库中的OID转移到使用bytea列。我试图将数据从一列复制到另一列,但我找不到正确的查询。这是我最接近的一次:
update user as thistable set pkcs_as_bytea = (select array_agg(mylargeobject.data) from
(select * from pg_largeobject where loid = thistable.pkcs12_as_oid order by pageno) as mylargeobject) where thistable.pkcs12 is not null这给出了以下错误消息:
ERROR: column "pkcs_as_bytea" is of type bytea but expression is of type bytea[]那么什么才是正确的查询呢?
发布于 2011-02-21 20:04:08
下面是一个实现此魔术的存储过程:
CREATE OR REPLACE FUNCTION merge_oid(val oid)
returns bytea as $$
declare merged bytea;
declare arr bytea;
BEGIN
FOR arr IN SELECT data from pg_largeobject WHERE loid = val ORDER BY pageno LOOP
IF merged IS NULL THEN
merged := arr;
ELSE
merged := merged || arr;
END IF;
END LOOP;
RETURN merged;
END
$$ LANGUAGE plpgsql;发布于 2012-04-29 02:38:35
另一种不需要自定义函数的方法是使用loread(lo_open(...))组合,例如:
UPDATE user SET pkcs_as_bytea = loread(lo_open(pkcs12_as_oid, 262144), 1000000) WHERE thistable.pkcs12 IS NOT NULL这段代码有一个问题,loread函数需要读取的最大字节数作为第二个参数(我上面使用的1000000参数),所以如果你的数据很大,你应该在这里使用一个非常大的数字。否则,内容将在这么多字节之后被裁剪,并且您无法将所有数据返回到bytea字段中。
如果要从OID转换为文本字段,还应使用转换函数,如下所示:
UPDATE user SET pkcs_as_text = convert_from(loread(lo_open(pkcs12_as_oid, 262144), 1000000), 'UTF8')(262144是开放模式的标志,十六进制的40000,意思是“打开只读”)
发布于 2019-02-27 18:53:57
嗯,我做过这样的事情。我有附件表和带有oid类型数据的content列。我迁移的时候有四个动作:
ALTER TABLE attachment add column content_bytea bytea
UPDATE attachment SET content_bytea = lo_get(content)
ALTER TABLE attachment drop column content
ALTER TABLE attachment rename column content_bytea to contenthttps://stackoverflow.com/questions/5041099
复制相似问题