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関数は2番目のパラメーターとして読み取る最大バイト数(1000000上記で使用したパラメーター)を必要とするため、データが大きい場合は、ここで非常に大きな数値を使用する必要があります。byteaそうしないと、この数バイト後にコンテンツがトリミングされ、すべてのデータがフィールドに戻されません。

OIDからテキストフィールドに変換する場合は、次のような変換関数も使用する必要があります。

UPDATE user SET pkcs_as_text = convert_from(loread(lo_open(pkcs12_as_oid, 262144), 1000000), 'UTF8')

262144は、オープンモードのフラグです40000。16進数で、「オープン読み取り専用」を意味します)

于 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タイプのデータがあります。私は4つのアクションで移行しました:

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 に答える