这里有张桌子:
CREATE TABLE my_table (
name VARCHAR2(20 BYTE) NOT NULL,
car VARCHAR2(40 BYTE) NOT NULL,
rank NUMBER,
PRIMARY KEY (name, car)
);
在 Java 中,我有一个 List - 存储信息名称、汽车、rank = null 的对象。
您需要编写一个实现以下内容的存储函数(pl/sql):
如果列表中有不在表中的对象,请将它们添加到表中。
如果列表中没有表中的记录,请将它们从表中删除。
在这些操作中,不要考虑排名字段(即在其值没有差异的情况下进行比较时)。
刚想到这个:
DECLARE
type my_table_array IS TABLE OF my_table%ROWTYPE;
v_Numbers my_table_array := my_table_array();
rec my_table%ROWTYPE;
idx number;
BEGIN
v_Numbers.extend(1);
idx := v_Numbers.count;
rec.name := 'John';
rec.car := 'Toyota';
rec.rank := 5;
v_Numbers(idx) := rec;
END;
现在如何在BEGIN中漂亮地检查?如果表中没有此类记录,则添加它们。并遍历所有 v_Numbers。
要同步两组数据,最好使用
MERGE. 包含新数据的集合可以是任何对您来说方便(并且可能)的东西。我找到了一个将对象类型数组从 java 传递到 oracle的示例,这在过程中使用时很方便。但是如果它有任何问题,您可以使用全局临时表来代替,或者将数据作为合并内的文本(作为表单的子查询select 'x','y' from DUAL union select 'z','z' ...)或作为过程参数(call my_procedure( my_rec_list( my_rec('x','y',NULL), my_rec('z','z',NULL))))的文本传递。如果您决定作为数组传递,那么您将需要创建对象记录类型和此类对象的数组类型:
在这种情况下,更新表的存储过程将如下所示:
合并中的行
update不会更改数据库中的任何内容,因为它会尝试将列更改为自身,但有必要使查询可以指定字符串delete。