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)发现错误(现在有一些错误!)并需要修复时,都必须更改数据库的结构。因此,代码
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)
- 但这是错误的,
仅仅是XML开发人员分配给xmlid
命令下的行的行号
- 如果您使用它,您将在一天内记录仪表X相对于仪表X的读数,并在第二天记录仪表X相对于仪表Y的读数。反之亦然
- 甚至他们也知道存在一个问题,[任何给定订单]字段中的仪表不断变化(注意
和modifieddt
)deleteddt
- 他们给了您
(供应商、型号、序列号)
- 这是仪表的唯一有效PK(如果您希望防止可预防的错误)
与您完全无关(它仅与XML开发人员相关),可以从XML文件中排除它xmlid
- 您会说
- “测试”可能不是一个好标签。当测试阶段完成时,它将是仪表的读数
- 读数中似乎有四个样本
- 员工可能没那么重要,我给它是为了完整
- 我所有的数据模型都在中呈现,这是自1993年以来关系数据库建模的标准
- 我的主要爱好是阅读
- 不能允许
为空串行
(更好的是Test
)必须通过(供应商、型号、序列号)识别适用的仪表test1..4
- 每个
没有标准化,应该有4个XML记录(对于每个测试中的4个样本
)test1..4
有日期时间,但不是test4
test1..3
中的日期时间需要为格式23(与其他日期时间相同)test4
- 员工是否识别订单或计量读数?我对前者进行了建模
解析XML 但是,我的解析器xml过程有一个问题。您能阅读我的过程并帮助我在其中包括FK吗
awk
来处理所有这些工作,所有的ETL
是eveperl