【发布时间】:2021-03-31 05:14:38
【问题描述】:
我有一个函数,它接受关联数组作为参数。函数 - 在插入/更新之前 - 需要检查表中是否存在记录,所以我需要遍历数组。
既然 FORALL 不允许 SELECT 语句,那么正确的方法是什么?
功能(只是我需要修复的部分 - 这是一个示例!!):
type t_name is table of MySchema.Orders.NAME%type index by pls_integer;
type t_year is table of MySchema.Orders.YEAR%type index by pls_integer;
type t_month is table of MySchema.Orders.MONTH%type index by pls_integer;
FUNCTION Check_records (name_in IN t_name, year_in IN t_year, month_in IN t_month) RETURN INTEGER
IS
record_exists INTEGER;
BEGIN
FORALL i in name_in.FIRST..name_in.LAST
SELECT COUNT(*) INTO record_exists
FROM MySchema.Orders@link_to_table
WHERE name= name_in(i)
AND year= year_in(i)
AND month= month_in(i);
return record_exist
END Check_records;
【问题讨论】:
-
对于任何想知道为什么的人 - 这将是一个在插入之前检查记录是否存在的函数。如果是这样,将再次调用函数来批量删除记录。因为我正在通过 OracleBulkCopy 类进行 BULK 插入(包括 BLOB) - 它直接插入记录而无需任何 PL\SQL... 换句话说,为了避免 BulkCopyClass 出现问题...
-
你希望你的函数返回什么?匹配的总数(即对 i 的所有值求和 count(*))?或者是其他东西?如果您只是要删除所有匹配的数据,为什么还要先进行检查?只需发出删除(如果您关心那里是否有数据,则返回删除的行数)。没有理由承担两次上桌的费用。
-
@JustinCave,在执行新的插入之前,用户需要被告知记录已经在那里,这只是一个应用程序设计。如果我已经在进行批量插入以提高速度并减少网络流量,我创建了这个函数。 BLOB 是个问题,在执行常规插入时会降低性能。
-
好的。所以你不一定要批量删除那里的记录?你希望你的函数返回什么?匹配的总数(即对 i 的所有值求和 count(*))?还是别的什么?
-
@JustinCave,是的,我想返回所有值的匹配总数(i)。