使PostgreSQL存储过程中的记录字段区分大小写

时间:2015-03-30 18:42:07

标签: stored-procedures postgresql-9.3

我在PostgreSQL存储过程中将记录字段定义为区分大小写时遇到问题。我将我的记录定义为:

CREATE TYPE  json_record AS (
    "objectType" text ,
    "objectSubtype" text 
};

我需要字段区分大小写的原因是因为记录是从存储过程中的JSON填充的,而我无法控制JSON内容

我的存储过程是:

CREATE OR REPLACE FUNCTION record(id uuid, json_in json)  RETURNS void AS $$
DECLARE
   raw_record json_record;
BEGIN
   SELECT  json_populate_record( NULL::json_record, json_in) INTO raw_record;
   INSERT INTO my_resource (uuid, type, subtype) 
      SELECT (id, raw_record.objectType, raw_record.objectSubtype);
END;
$$ LANGUAGE plpgsql VOLATILE;

当我执行程序时,我收到错误:

ERROR:  record "raw_record" has no field "objecttype"

我理解错误的原因:“json_record”是使用区分大小写的字段定义的,但PostgreSQL的执行引擎将raw_record.objectType和raw_record.objectSubtype转换为raw_record.objecttype和raw_record.objectsubtype。问题是如何避免这种情况并强制记录的字段被视为区分大小写。我能想到的唯一解决方案是使用动态SQL,逐段构建查询并将字段包装在quote_ident()中,但我想知道是否有更简单的解决方案来强制执行记录的区分大小写?

1 个答案:

答案 0 :(得分:0)

  

强制记录的字段被视为区分大小写

与使用区分大小写的标识符的方式相同:您需要将它们用双引号括起来。您也不需要插入SELECT子句:

INSERT INTO my_resource (uuid, type, subtype) 
VALUES (id, raw_record."objectType", raw_record."objectSubtype");

作为旁注:select (a,b,c) 您认为它的作用。它选择一个单个列作为匿名记录(包含三个字段)。它不会选择三列。因此,如果您确实想要使用select版本而不是values,则必须删除括号:

INSERT INTO my_resource (uuid, type, subtype) 
SELECT id, raw_record."objectType", raw_record."objectSubtype";