我们已决定从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[]
那么什么是正确的查询呢?
答案 0 :(得分:4)
另一种不需要自定义功能的方法是使用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
是开放模式的标志,{16}中的40000
,表示"打开只读")
答案 1 :(得分:1)
这是一个神奇的存储过程:
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;
答案 2 :(得分:0)
对于文本数组,您需要类似array_to_string(anyarray, text)
的内容,但在这种情况下需要array_to_bytea(largeobjectarray)
来连接所有部分。您必须自己创建此函数,或在应用程序逻辑中处理此函数。
答案 3 :(得分:0)
好吧,我做了这样的事情。我的附件表和内容列的数据类型为oid。我迁移了四个动作:
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 content