Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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
PLSQL:解析数据并将数据从XML插入表_Xml_Parsing_Plsql_Procedure - Fatal编程技术网

PLSQL:解析数据并将数据从XML插入表

PLSQL:解析数据并将数据从XML插入表,xml,parsing,plsql,procedure,Xml,Parsing,Plsql,Procedure,我有以下表格: create table TBL$ORDERS ( order_num VARCHAR2(25), employee VARCHAR2(100), createddt VARCHAR2(20), modifieddt VARCHAR2(20), deleteddt VARCHAR2(20), state VARCHAR2(15), ts VARCHAR2(20), nni

我有以下表格:

 create table TBL$ORDERS  
(  
  order_num  VARCHAR2(25),  
  employee   VARCHAR2(100),  
  createddt  VARCHAR2(20),  
  modifieddt VARCHAR2(20),  
  deleteddt  VARCHAR2(20),  
  state      VARCHAR2(15),  
  ts         VARCHAR2(20),  
  nni        VARCHAR2(20),  
  constraint pk_orders primary key (order_num)  
);  

create table TBL$METERS  
(  
  order_num  VARCHAR2(25),  
  xmlid      VARCHAR2(5),  
  createddt  VARCHAR2(20),  
  modifieddt VARCHAR2(20),  
  deleteddt  VARCHAR2(20),  
  vendor     VARCHAR2(25),  
  model      VARCHAR2(25),  
  serial     VARCHAR2(25),  
  constraint pk_meters primary key (order_num, xmlid),  
  constraint fk_orders foreign key (order_num) references TBL$ORDERS (order_num)  
);  

create table TBL$TESTS  
(  
  order_num    VARCHAR2(25),  
  meterxmlid   VARCHAR2(5),    
  xmlid        VARCHAR2(5),    
  createddt    VARCHAR2(20),  
  testcount    VARCHAR2(5),  
  successcount VARCHAR2(5),  
  test1        VARCHAR2(50),  
  test2        VARCHAR2(50),  
  test3        VARCHAR2(50),  
  test4        VARCHAR2(50),  
  constraint pk_tests primary key (order_num, meterxmlid, xmlid),  
  constraint fk_meters foreign key (order_num, meterxmlid) references TBL$METERS (order_num, xmlid)  
); 
我想用以下代码填充它:

procedure PopulateTables(pXMLClob clob) is  
begin  
  for recOrders in (  
    select *  
    from   XMLTable(  
             '/Orders/Order'  
             passing XMLType(pXMLClob)  
               columns  
                 order_num  VARCHAR2(25)  path '@order_num',  
                 employee   VARCHAR2(100) path '@employee',  
                 createddt  VARCHAR2(20)  path '@createdDT',  
                 modifieddt VARCHAR2(20)  path '@modifiedDT',  
                 deleteddt  VARCHAR2(20)  path '@deletedDT',  
                 state      VARCHAR2(15)  path '@state',  
                 ts         VARCHAR2(20)  path '@ts',  
                 nni        VARCHAR2(20)  path '@nni',  
                 Meters     xmltype      path 'Meter'  
             )  
  )  
  loop  
    insert into TBL$ORDERS(order_num, employee, createddt, modifieddt, deleteddt, state, ts, nni)  
    values (recOrders.order_num, recOrders.employee, recOrders.createddt, recOrders.modifieddt, recOrders.deleteddt, recOrders.state, recOrders.ts, recOrders.nni);  
    for recMeters in (  
      select *  
      from   XMLTable(  
               '/Orders/Order'  
               passing XMLType(recOrders.Meters)  

                 columns  
                    xmlid      VARCHAR2(5)  path '@xmlid',  
                    createddt  VARCHAR2(20) path '@createdDT',  
                    modifieddt VARCHAR2(20) path '@modifiedDT',  
                    deleteddt  VARCHAR2(20) path '@deletedDT',  
                    vendor     VARCHAR2(25) path '@vendor',  
                    model      VARCHAR2(25) path '@model',  
                    serial     VARCHAR2(25) path '@serial',  
                    order_num  VARCHAR2(25) path '@order_num',  
                    tests      xmltype      path 'test'  
             )      
    )  
    loop  
      insert into TBL$METERS (order_num, xmlid, createddt, modifieddt, deleteddt, vendor, model, serial)  
      values (recOrders.order_num, recMeters.xmlid, recMeters.createddt, recMeters.modifieddt, recMeters.deleteddt, recMeters.vendor, recMeters.model, recMeters.serial);  
      for recTest in (  
        select *  
        from   XMLTable(  
                 '/Orders/Order'  
                 passing XMLType(recMeters.Tests)  
                 columns 
  xmlid        VARCHAR2(5) path '@xmlID',
  createddt    VARCHAR2(20) path '@createdDT',
  testcount    VARCHAR2(5) path '@testCount',
  successcount VARCHAR2(5) path '@successCount',
  test1        VARCHAR2(50) path '@test1',
  test2        VARCHAR2(50) path '@test2',
  test3        VARCHAR2(50) path '@test3',
  test4        VARCHAR2(50) path '@test4',
  meter_xmlid  VARCHAR2(5) path '@xmlID',
  order_order_num varchar(25) path '@order_num' 

               )          
      )  
      loop  

      insert into TBL$TESTS (xmlid, createddt, testcount, successcount, test1, test2, test3, test4, meter_xmlid , order_order_num  )  
      values (recTest.xmlid, recTest.createddt, recTest.testcount, recTest.successcount, recTest.test1, recTest.test2, recTest.test3, recTest.test4, recMeters.xmlid, recOrders.Order_num);

      end loop;    
    end loop;   
  end loop;  
  commit;    
end;
我在传递XMLTYPE()的行中遇到错误

ora-00306调用XMLTYPE时类型或参数的数量错误

有人能告诉我如何解决这个问题吗?

我确实对你之前的问题给出了答案,你已经删除了。我把它改了以适应新问题。问题是一样的


方法 在这些表之间建立关系
我需要使用PKs和FKs在这些表之间建立关系

它不是那样工作的。我很感激你有一个任务,一个狭隘的关注点来完成工作,但是这种心态充满了问题。不仅是现在,而且是将来会暴露的可预测和可预防的错误

正确的方法是:

  • 创建一个与自然世界相匹配的数据库。为什么?因为宇宙的结构不会改变(内容会改变)。
    • 这将使您的应用程序不受更改(来自XML端的更改)的影响
    • 否则,每次XML(a)更改或(b)发现错误(现在有一些错误!)并需要修复时,都必须更改数据库的结构。因此,代码
相反的是维护开发人员对数据的视图(您现在需要的),这与现实世界几乎没有关系。在这种情况下,你永远不会真正理解数据的本来面目,你将以片段的形式处理数据,你将像一个shell游戏一样不断地移动它们

我有以下表格:

 create table TBL$ORDERS  
(  
  order_num  VARCHAR2(25),  
  employee   VARCHAR2(100),  
  createddt  VARCHAR2(20),  
  modifieddt VARCHAR2(20),  
  deleteddt  VARCHAR2(20),  
  state      VARCHAR2(15),  
  ts         VARCHAR2(20),  
  nni        VARCHAR2(20),  
  constraint pk_orders primary key (order_num)  
);  

create table TBL$METERS  
(  
  order_num  VARCHAR2(25),  
  xmlid      VARCHAR2(5),  
  createddt  VARCHAR2(20),  
  modifieddt VARCHAR2(20),  
  deleteddt  VARCHAR2(20),  
  vendor     VARCHAR2(25),  
  model      VARCHAR2(25),  
  serial     VARCHAR2(25),  
  constraint pk_meters primary key (order_num, xmlid),  
  constraint fk_orders foreign key (order_num) references TBL$ORDERS (order_num)  
);  

create table TBL$TESTS  
(  
  order_num    VARCHAR2(25),  
  meterxmlid   VARCHAR2(5),    
  xmlid        VARCHAR2(5),    
  createddt    VARCHAR2(20),  
  testcount    VARCHAR2(5),  
  successcount VARCHAR2(5),  
  test1        VARCHAR2(50),  
  test2        VARCHAR2(50),  
  test3        VARCHAR2(50),  
  test4        VARCHAR2(50),  
  constraint pk_tests primary key (order_num, meterxmlid, xmlid),  
  constraint fk_meters foreign key (order_num, meterxmlid) references TBL$METERS (order_num, xmlid)  
); 
首先是误解。这些不是表,这只是传入XML的定义。将它们视为表意味着您认为这是需要在数据库中实现的最终产品。然后,对现实世界的感知,以及数据如何表现现实世界的感知,就消失了

  • 事实上,您有一个XML文件定义,它不是1::1表,也不是真实世界中的1::1
有人告诉我一个订单可以有很多米,一个米可以有很多测试。
但是,我在这些表中没有看到可以建立关系的属性

这是因为(在XML中)没有。再次强调,您必须弄清楚,再次强调,最好的选择是真实世界,而不是XML

仪表表中应有字段order_num,测试表中应有仪表id

如果你想要一个20世纪60年代的档案系统,这是可以的,这就是“理论家”和跟随他们的作者错误地宣传的“关系型”档案系统。高度有限,没有完整性

我看到您现在已经添加了这些字段

这是一个很好的例子,说明它没有任何完整性

  • 如何[正确]识别仪表?
    • 您会说
      主键(order_num,xmlid)
    • 但这是错误的,
      xmlid
      仅仅是XML开发人员分配给
      命令下的行的行号
    • 如果您使用它,您将在一天内记录仪表X相对于仪表X的读数,并在第二天记录仪表X相对于仪表Y的读数。反之亦然
    • 甚至他们也知道存在一个问题,[任何给定订单]字段中的仪表不断变化(注意
      modifieddt
      deleteddt
    • 他们给了您
      (供应商、型号、序列号)
    • 这是仪表的唯一有效PK(如果您希望防止可预防的错误)
    • xmlid
      与您完全无关(它仅与XML开发人员相关),可以从XML文件中排除它
关系数据库 我可以提供此任务所需的关系数据库。它具有完整的数据完整性。但这是第一次削减,不完整。为什么?因为XML文件中存在严重错误。一旦你修复了这些错误,我可以调整数据库,它就会完成

  • “测试”可能不是一个好标签。当测试阶段完成时,它将是仪表的读数
  • 读数中似乎有四个样本
  • 员工可能没那么重要,我给它是为了完整
  • 我所有的数据模型都在中呈现,这是自1993年以来关系数据库建模的标准
  • 我的主要爱好是阅读
错误是XML文件 (参考已删除问题中给出的XML文件

  • 不能允许
    串行
    为空
  • Test
    (更好的是
    test1..4
    )必须通过(供应商、型号、序列号)识别适用的仪表
  • 每个
    测试中的4个样本
    没有标准化,应该有4个XML记录(对于每个
    test1..4
  • test4
    有日期时间,但不是
    test1..3
  • test4
    中的日期时间需要为格式23(与其他日期时间相同)
  • 员工是否识别订单或计量读数?我对前者进行了建模
最后,一旦重复和愚蠢被移除,这个,比他们给你的要简单得多


解析XML 但是,我的解析器xml过程有一个问题。您能阅读我的过程并帮助我在其中包括FK吗

  • 不。这超出了这个问题的范围。请提出一个新问题,并请该领域的人帮助您

  • 链接失败

  • 坦率地说,我从不为那些声称要解析XML的产品而烦恼,它们的麻烦比它们的价值还多,当它们失败时,你必须自己动手处理。我只编写解析XML的代码,这很简单。我使用
    awk
    来处理所有这些工作,所有的ETL

    • perl
      是eve