Plsql Oracle11g中“插入所有”RDF三元组引发异常

Plsql Oracle11g中“插入所有”RDF三元组引发异常,plsql,oracle11g,rdf,oracle-spatial,Plsql,Oracle11g,Rdf,Oracle Spatial,创建包含rdf数据的新表后 create table rdf_data (triple SDO_RDF_TRIPLE_S); execute SEM_APIS.CREATE_SEM_MODEL('mymodel', 'rdf_data', 'triple'); 我试图一次添加多个RDF三元组 insert all into rdf_data(triple) values (sdo_rdf_triple_s('mymodel', 'foo', 'bar', 'foobar')) into r

创建包含rdf数据的新表后

create table rdf_data (triple SDO_RDF_TRIPLE_S);
execute SEM_APIS.CREATE_SEM_MODEL('mymodel', 'rdf_data', 'triple');
我试图一次添加多个RDF三元组

insert all 
into rdf_data(triple) 
values (sdo_rdf_triple_s('mymodel', 'foo', 'bar', 'foobar'))
into rdf_data(triple) 
values (sdo_rdf_triple_s('mymodel', 'bar', 'foo', 'foobar')) 
select 1 from dual;
但是,我得到以下错误:

ORA-00932:  inconsistent datatypes: expected NUMBER got BINARY
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
相反,以下示例有效:

-- Trying insert all with integers
create table foo(a integer);
insert all 
into foo values (1) 
into foo values (2) 
select 1 from dual;

-- Inserting a single RDF triple
insert into rdf_data(triple) 
values (sdo_rdf_triple_s('mymodel', 'foo', 'bar', 'foobar'));
然而,给定一个1000000个元组的表,我需要为每个元组执行许多插入,例如,为每个表属性执行一次插入。我认为多次插入不是一个可行的解决方案

create table bar(id varchar(100), foo char(100), foobar char(100));
insert all
into rdf_data(triple) 
values (sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<rdfs:type>', '<myont:Bar>'))
into rdf_data(triple) 
values (sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFoo>', foo))
into rdf_data(triple) 
values (sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFooBar>', foobar)) 
into rdf_data(triple) values (...)
select * from bar;

在使用insert all插入多个三元组的过程中,是否存在已知的错误?

我想您可以说这是一个错误。或者至少在处理SDO_TRIPLE_对象类型时有一个限制

那么,为什么不使用多个插入呢

编辑1:基于OP的澄清

因此,实际需要从单个输入行生成多个三元组。很抱歉,在原来的问题中遗漏了这一点。对于multi-insert语句来说,这绝对是一个合适的用法。不幸的是,当值列表包含SDO_RDF_TRIPLE_S对象时,这似乎不起作用。该限制并不适用于所有对象,其他对象类型也可以正常工作

但是,SDO_RDF_TRIPLE_构造函数在检查物理三元组存储中的现有值方面做了大量工作。我想这就是造成麻烦的原因

编辑2:只要插入的列多于三个正确的列,原始的INSERT ALL语法就可以正常工作

让我们像这样重新定义三重表:

create table rdf_data (id number,triple SDO_RDF_TRIPLE_S);
insert all
into rdf_data(id, triple) 
values (id, sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<rdfs:type>', '<myont:Bar>'))
into rdf_data(id, triple) 
values (id, sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFoo>', foo))
into rdf_data(id, triple) 
values (id, sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFooBar>', foobar)) 
select * from bar;

12 rows created.

Elapsed: 00:00:00.10
并在insert中填充新的ID列,如下所示:

create table rdf_data (id number,triple SDO_RDF_TRIPLE_S);
insert all
into rdf_data(id, triple) 
values (id, sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<rdfs:type>', '<myont:Bar>'))
into rdf_data(id, triple) 
values (id, sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFoo>', foo))
into rdf_data(id, triple) 
values (id, sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFooBar>', foobar)) 
select * from bar;

12 rows created.

Elapsed: 00:00:00.10
以下是插页:

-- Insert the "<rdfs:type>" triples
insert into rdf_data(triple) 
select sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<rdfs:type>', '<myont:Bar>')
from bar;

-- Insert the "<myont:hasFoo>" triples
insert into rdf_data(triple) 
select sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFoo>', foo)
from bar;

-- Insert the "<myont:hasFooBar>" triples
insert into rdf_data(triple) 
select sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFooBar>', foobar)
from bar;

commit;
变体可能更有效:

insert /*+ append */ into rdf_data(triple) 
-- Insert the "<rdfs:type>" triples
select sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<rdfs:type>', '<myont:Bar>')
from bar
union all
-- Insert the "<myont:hasFoo>" triples
select sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFoo>', foo)
from bar
union all
-- Insert the "<myont:hasFooBar>" triples
select sdo_rdf_triple_s('mymodel', '<myont:'||id||'>', '<myont:hasFooBar>', foobar)
from bar;
commit;

您的sdo_rdf_triple_s类型是否与在中定义的类型相同?它似乎由五个数字组成,而不是像您的示例中那样由四个字符串组成。使用SDO_TRIPLE_S是正确的。该类型的内部内容实际上是一组5个数字,但最常见的构造函数使用4个字符串并使用5个数字构造实际对象。对象中的数字指向实际字符串值,保存在内部表MDSYS.RDF_VALUE$中。给定一个包含1000000个元组的表,我需要为每个元组执行许多插入操作,因此我不认为有多个插入操作是可行的解决方案。我还编辑了我的问题。为此,只需执行一个简单的插入。。。选择。也许我错了,但Oracle 11g不支持将inserto插入rdf_datatriple值。。。从工具栏中选择*;就像MySQL一样。我怎么能在不插入全部的情况下一次添加多个值呢。你凭什么认为它不是?你试过了吗?您失败了吗?通过查看,oracle 11g不支持上述注释的语法。此外,doc还提供了一个示例,利用多表insert all将来自同一个select查询的多个数据插入表中