postgresql Postgressql Xmltable作为过程输入的字符串问题

np8igboo  于 2023-02-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

你好,我正在尝试在函数中使用xmltable,来更新其他表中的一些数据,至于输入,我得到了字符串
这是一个测试程序,最终结果将是插入应该从任何xml创建做一些数据调整
XML如下所示

<header>
    <data>
        <line>
            <field1>some data in f1</field1>
            <field2>other data f2</field2>
            <field3>this data contains numers 012323</field3>
            <field4>and the last data</field4>
       <line>               
    </data>             
</header>

我正在采取下一步行动
用转换成xml输入值的字符串创建表

create table if not exists test_xml_table as select input_string::xml as string_xml;

我会做一些数据调整
插入最终步骤

insert into test_tab( field1, field2, field3, field4 ) 
    select xt.field1, xt.field2, xt.field3, field4 from test_xml_table 
    cross join xmltable( '/data/line' passing string_xml
        columns field1 text path 'field1', field2 text path 'field2', 
        field3 text path 'field3', field4 text path 'field4' ) as xt;

问题是,如果表test_xml_table不存在,程序不会创建它(在创建表命令后仍然看不到它。我尝试做变通方案,首先创建表并用XML数据填充它,但现在我不知道在PASSING短语后放什么。没有错误,只是没有插入数据。将感谢帮助
整个代码如下

create or replace function test_function(

input_string character varying )
RETURNS void
LANGUAGE plpgsql

as $BODY$

begin 
create table test_xml_table as select input_string::xml as string_xml;
    
insert into test_tab( field1, field2, field3, field4 ) 
    select xt.field1, xt.field2, xt.field3, field4 from test_xml_table 
    cross join xmltable( '/data/line' passing string_xml
        columns field1 text path 'field1', field2 text path 'field2', 
        field3 text path 'field3', field4 text path 'field4' ) as xt;
                                        
end;

$BODY$;

调用-〉

select test_function( '<header>
    <data>
      <line>
         <field1>some data in f1</field1>
         <field2>other data f2</field2>
         <field3>this data contains numers 012323</field3>
         <field4>and the last data</field4>
       </line>              
     </data>                
</header>'   )

尝试使用postgres xmltable函数将数据插入到表中。我希望来自类型为 * 字符变化 * 的函数输入的数据将插入数据

lskq00tm

lskq00tm1#

不需要cross join
xml namespace_uri应该是/header/data/line,而不仅仅是/data/line

create or replace function test_function( input_string character varying )
      RETURNS void
      LANGUAGE plpgsql
      as $BODY$
      begin 
      create table test_xml_table as select input_string::xml as string_xml;
      insert into test_tab( field1, field2, field3, field4 ) 
        select xt.field1, xt.field2, xt.field3, field4 
        from test_xml_table, xmltable( '/header/data/line' passing string_xml
            columns 
               field1 text path 'field1', 
               field2 text path 'field2', 
               field3 text path 'field3', 
               field4 text path 'field4' 
        ) as xt;                                   
    end;
    
    $BODY$;

Demo here

相关问题