【问题标题】:lo_create(0) how to use with insert querylo_create(0) 如何与插入查询一起使用
【发布时间】:2018-07-04 10:47:48
【问题描述】:
insert into hospital_image 
select 'HospitalImage', 
       lo_from_bytea(1,decode('/9j/4AAQSkZJRgABAQEA3ADcAAD','base64')),
       'jpg',
       '123'
where not exists (select null from pg_largeObject where loid=1);

CREATE TABLE hospital_image ( 
   key character varying(30) NOT NULL, 
   image oid NOT NULL,
   mime_type character varying(30) NOT NULL, 
   version numeric(8,0) NOT NULL,
   CONSTRAINT 
      pk_hospital_image PRIMARY KEY (key)
) WITH ( OIDS=FALSE );

 ALTER TABLE
    hospital_image OWNER TO postgres;

在上面的语句中,我们手动将loid 提供为1。相反,我们希望使用lo_create(0) 动态获取loid。当我按照the Postgres docs 使用lo_create(0) 时,我得到一个异常。

我同时使用了lo_creat(-1)lo_create(0)。两者都不起作用。它是说loid 已经存在。如何在我的查询中使用上述函数。


包含变量 OID 的我的 SQL 语句是:

INSERT INTO hospital_image (key, image, mime_type, version)
VALUES ('MainLogoImage99999',
        lo_from_bytea(lo_create(0),
                      decode('/9j4AAQSkZJRgABAQEA3ADcAAD',
                      'base64'))‌​,
        'jpg',
        123);

错误信息是:

ERROR: duplicate key value violates unique constraint "pg_largeobject_metadata_oid_index"
SQL state: 23505
Detail: Key (oid)=(34773) already exists. 

【问题讨论】:

  • insert into hospital_image select 'MainLogoImage99999', lo_from_bytea(lo_create(-1),decode('/erewreerregrefgrege','base64')),'jpg','123';
  • CREATE TABLE hospital_image (关键字符变化(30)非空,图像 oid 非空,mime_type 字符变化(30)非空,版本数字(8,0)非空,约束 pk_hospital_image 主键(键) ) WITH (OIDS=FALSE); ALTER TABLE hospital_image OWNER TO postgres;
  • 错误:重复的键值违反了唯一约束“pg_largeobject_metadata_oid_index”详细信息:键(oid)=(4294967295)已经存在。 **********错误**********
  • select lo_creat(-1) 返回 35608 的 oid 但是当我在插入语句中使用时,我收到 35609 已经存在的错误。我不知道。
  • insert into static_image select 'MainLogoImage99999', lo_from_bytea(max(loid::bigint),decode('/erewreerregrefgrege','base64')),'jpg','123';ERROR: column "loid" 不存在第 2 行:lo_from_bytea(max(loid::bigint),decode('/erewreerregrefgrege... ^ ********** 错误 ********** 错误:列“loid”不存在 SQL 状态:42703 字符:74

标签: sql postgresql blob bytea


【解决方案1】:

lo_creat(-1)(参数无关紧要)和lo_create(0)都会创建一个新的大对象并返回它的OID。

lo_create(-1)lo_create(4294967295) 相同——OID 是无符号的 4 字节整数。

lo_from_bytea 创建了一个新的大对象,所以如果你将lo_create的结果传递给它,它会抱怨它不能再次创建一个具有相同数字的大对象。

只需将0 而不是lo_create(0) 作为第一个参数传递给lo_from_bytea

【讨论】:

  • 我也检查过。不,它不会像那样发生。lo_create 给你一个以前不存在的 oid。但对我来说,它每次都会给出同样的错误。在插入语句中,我想从 postgres 的函数中提供 oid,如 lo_creat(-1) 或 lo_create(0)
  • 我已经给出了一个表结构。你能帮我为上面的表结构写一个插入查询吗?在 postgres 函数的帮助下使用动态提供 loid
  • 代码看起来如何准确?在您的问题中,您使用常量 1。实际上您会执行类似 myoid := lo_create(0); 的操作,然后写入大对象,然后将 myoid 插入表中。
  • INSERT INTO hospital_image(key, image, mime_type, version) VALUES ('MainLogoImage99999', lo_from_bytea(myoid := lo_create(0),decode('/9j/4AAQSkZJRgABAQEA3ADcAAD','base64')) , 'jpg', 123);
  • 当我执行上述语句时出现以下错误错误:位置参数不能跟随命名参数第 3 行:...oImage99999', lo_from_bytea(myoid := lo_create(0),decode('/9. .. ^
猜你喜欢
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2022-09-29
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多