Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 从xml插入多条记录_Postgresql_Xpath - Fatal编程技术网

Postgresql 从xml插入多条记录

Postgresql 从xml插入多条记录,postgresql,xpath,Postgresql,Xpath,我希望大容量插入到PostgreSQL数据库中:后端代码将创建类似XML的XML <items> <i dt="2014-08-01" name="vvv" count="12" /> <i dt="2014-08-02" name="zzz" count="6" /> </items> 现在,最后我希望temp_值有3条记录,就像在XML中一样,但是表是空的 如果注释掉insert into行,您将看到值被正确解析。它只是返回一条记

我希望大容量插入到PostgreSQL数据库中:后端代码将创建类似XML的XML

<items>
   <i dt="2014-08-01" name="vvv" count="12" />
   <i dt="2014-08-02" name="zzz" count="6" />
</items>
现在,最后我希望temp_值有3条记录,就像在XML中一样,但是表是空的

如果注释掉insert into行,您将看到值被正确解析。它只是返回一条记录,其中每列都是一个数组,而不是返回多条记录

我遗漏了什么?

很显然,数组索引是解决方案:

unnestarray |将数组展开为一组行

所以代码应该是

CREATE TEMP TABLE temp_values (dt date, name varchar, count int) ON COMMIT DROP;

WITH x AS (SELECT '
  <items>
    <i dt="2014-08-01" name="vvv" count="12" />
    <i dt="2014-08-02" name="zzz" count="6" />
    <i dt="2014-08-03" name="bbd" count="10" />
  </items>'::xml AS t
)
INSERT INTO temp_values
SELECT 
  CAST(CAST((xpath('//@dt', node))[1] as varchar) as date),
  CAST((xpath('//@name', node))[1] as varchar),
  CAST(CAST((xpath('//@count', node))[1] as varchar) as int)
FROM (SELECT unnest(xpath('/items/i', t)) AS node FROM x) sub;

SELECT * FROM temp_values

我希望在@之前删除一些额外的斜杠:

CREATE TEMP TABLE temp_values (dt date, name varchar, count int) ON COMMIT DROP;

WITH x AS (SELECT '
  <items>
    <i dt="2014-08-01" name="vvv" count="12" />
    <i dt="2014-08-02" name="zzz" count="6" />
    <i dt="2014-08-03" name="bbd" count="10" />
  </items>'::xml AS t
)
INSERT INTO temp_values
SELECT 
  CAST(CAST((xpath('@dt', node))[1] as varchar) as date),
  CAST((xpath('@name', node))[1] as varchar),
  CAST(CAST((xpath('@count', node))[1] as varchar) as int)
FROM (SELECT unnest(xpath('/items/i', t)) AS node FROM x) sub;

SELECT * FROM temp_values
CREATE TEMP TABLE temp_values (dt date, name varchar, count int) ON COMMIT DROP;

WITH x AS (SELECT '
  <items>
    <i dt="2014-08-01" name="vvv" count="12" />
    <i dt="2014-08-02" name="zzz" count="6" />
    <i dt="2014-08-03" name="bbd" count="10" />
  </items>'::xml AS t
)
INSERT INTO temp_values
SELECT 
  CAST(CAST((xpath('@dt', node))[1] as varchar) as date),
  CAST((xpath('@name', node))[1] as varchar),
  CAST(CAST((xpath('@count', node))[1] as varchar) as int)
FROM (SELECT unnest(xpath('/items/i', t)) AS node FROM x) sub;

SELECT * FROM temp_values