Java 如何使用PreparedStatement在Oracle中的嵌套表中插入行

Java 如何使用PreparedStatement在Oracle中的嵌套表中插入行,java,oracle,prepared-statement,nested-table,Java,Oracle,Prepared Statement,Nested Table,我在Oracle数据库中创建了两种类型,分别为OBJECT、table和嵌套表。我知道如何在cmd中的表中插入行,但我不知道如何使用Java中的PreparedStatement在该表中插入行。 这是我的表格和类型: CREATE Or REPLACE TYPE item AS OBJECT ( id number, counter number );/ CREATE Or REPLACE TYPE time AS OBJECT ( year n

我在Oracle数据库中创建了两种类型,分别为OBJECT、table和嵌套表。我知道如何在cmd中的表中插入行,但我不知道如何使用Java中的
PreparedStatement
在该表中插入行。 这是我的表格和类型:

 CREATE Or REPLACE TYPE item AS OBJECT
( 
  id        number,
  counter   number
);/
CREATE Or REPLACE TYPE time AS OBJECT
( 
  year        number,
  month number,
  second number
);
CREATE Or REPLACE TYPE Shoping_list AS TABLE OF item;
create table invoice(
id number NOT NULL PRIMARY KEY ,
list shoping_list,
dateIn date,
timeIn time,
totalCost number )
nested table list store as list_of_product;
我可以在cmd中插入此代码

insert into invoice(id,list,dateIn,timeIn,totalCost) values(seq_ID_invoice.nextval,
shoping_list(item(1,2),item(26,1)),TO_DATE('1396-04-11','YYYY-MM-DD'),time(11,25,40),7000);
这是我的java代码

preparedStatement = connection.prepareStatement("insert into invoice (id,list,dateIn,timeIn,totalCost) values ("+id+",?,?,?,?)");

seq_ID_invoice
是Oracle序列。因此,oracle会自动获取其价值。对于rest,您可以使用
setInt、setString、setFloat等方法。
根据表中定义的列类型,在
PreparedStatement
中提供。
以下示例代码可能会对您有所帮助。


项目1的项目id的项目值,项目1的计数器的项目值,…
这些是java变量。您可以根据自己的选择定义变量,也可以直接使用值来代替这些变量。

时间的作用是什么<代码>时间类型?
DATE
数据类型值始终包含时间部分。当我将时间作为数据类型写入时,我看到此错误:“无效数据类型”是,只是Oracle中没有
time
DATE类型。这一切都在
DATE
谢谢。但购物清单中的商品数量并不总是两个(固定)。您可以对清单中的每一个商品进行
setInt
多次操作。1,2,3,... 是参数的索引,它们将根据您的需要增加或减少。这些索引编号必须等于查询中的
编号。例如,在上面的查询中有9个
。意味着我们正在为9个实体设置值,因此索引已达到9。
PreparedStatement ps = connection.prepareStatement(
    "insert into invoice(id, list, dateIn, timeIn, totalCost)"+
    " values (seq_ID_invoice.nextval, shoping_list(item(?,?), item(?,?)), TO_DATE(?,'YYYY-MM-DD'), time(?, ?, ?), ?)");

ps.setInt(1, int_value_for_id_of_item_1);
ps.setInt(2, int_value_for_counter_of_item_1);
ps.setInt(3, int_value_for_id_of_item_2);
ps.setInt(4, int_value_for_counter_of_item_2);
ps.setString(5, string_value_for_date);
ps.setInt(6, int_value_for_year_of_time);
ps.setInt(7, int_value_for_month_of_time);
ps.setInt(8, int_value_for_second_of_time);
ps.setInt(9, int_bvalue_for_total_cost);

int rowCnt = ps.executeUpdate();  
System.out.println(rowCnt+" rows affected.");