4

我们已决定从OIDPostgreSQL 9.0 数据库中的 s 转移并改用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[]

那么正确的查询是什么?

4

4 回答 4

5

不需要自定义函数的另一种方法是使用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以十六进制表示,表示“只读打开”)

于 2012-04-28T18:38:34.740 回答
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;
于 2011-02-21T12:04:08.487 回答
1

好吧,我做了这样的事情。我有带有 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
于 2019-02-27T10:53:56.790 回答
0

您需要类似array_to_string(anyarray, text)文本数组的东西,但在这种情况下是array_to_bytea(largeobjectarray)连接所有部分。您必须自己创建此函数,或在应用程序逻辑中处理此函数。

于 2011-02-18T13:27:31.113 回答