在 PLSQL 中查找 dbms_utility.lname_array 类型的 2 个数组之间的差异
Posted
技术标签:
【中文标题】在 PLSQL 中查找 dbms_utility.lname_array 类型的 2 个数组之间的差异【英文标题】:finding the difference between 2 arrays of type dbms_utility.lname_array in PLSQL 【发布时间】:2018-08-15 16:18:28 【问题描述】:我目前使用的是 ORACLE 10g 版本。
我需要找出 2 个数组之间元素的差异。 (注意:数组的类型为 dbms_utility.lname_array)
下面是例子。
在下面的示例中,我需要在第一个数组中找到不在第二个数组中的元素。 (l_new_array 中的元素 3 在 l_old_array 中不存在)
declare
l_new_array dbms_utility.lname_array;
l_old_array dbms_utility.lname_array;
g_new varchar2(200) := '1,2,3,4';
g_old varchar2(200) := '1,2,4,5';
l_new_count binary_integer;
l_old_count binary_integer;
begin
dbms_utility.comma_to_table(
list => regexp_replace(g_new,'(^|,)','\1x'),
tablen => l_new_count,
tab => l_new_array
);
dbms_utility.comma_to_table(
list => regexp_replace(g_old,'(^|,)','\1x'),
tablen => l_old_count,
tab => l_old_array
);
dbms_output.put_line (l_new_array-l_old_array);
if (l_new_array <> l_old_array) then
dbms_output.put_line ('if');
else
dbms_output.put_line ('else');
end if;
end;
【问题讨论】:
当你说'不存在'时,你的意思是它根本不存在,还是不在那个位置?即如果g_old
是''1,2,4,3'
,你想看什么。具有所有相同的元素但顺序不同?
【参考方案1】:
您需要遍历数组并比较它们的元素。我不确定你是否也想要通用的 if/else,所以我将包括这两个部分,作为你适应你需要看到的内容的起点:
declare
...
l_different boolean := false;
begin
dbms_utility.comma_to_table(...);
dbms_utility.comma_to_table(...);
if l_new_count != l_old_count then
l_different := true;
dbms_output.put_line('Different sizes (' || l_new_array.count
||'/'|| l_old_array.count ||')');
else
for i in 1..l_new_count loop
if l_new_array(i) != l_old_array(i) then
l_different := true;
dbms_output.put_line('Mismatch at position ' || i || ': '
|| l_old_array(i) || ' => ' || l_new_array(i));
exit;
end if;
end loop;
end if;
if l_different then
dbms_output.put_line ('if');
else
dbms_output.put_line ('else');
end if;
end;
/
得到输出:
Mismatch at position 3: x4 => x3
if
PL/SQL procedure successfully completed.
l_different
仅用于执行最终的 if/else,如果您不希望这样做 - 只需“不匹配”消息就足够了 - 那么您不需要声明、设置或使用它。
您可能希望以不同的方式处理不同的长度,至少在新元素比旧元素多的情况下,但这也是您工作的起点。
【讨论】:
谢谢亚历克斯。是的,我现在已经完成了循环。但我想知道除了循环之外是否有任何直接比较函数可用于此操作。 不是那种集合类型。还有其他选项for nested tables,但您使用的是关联数组。 嗨,亚历克斯。有没有办法将我的数组类型(dbms_utility.lname_array)转换为嵌套表而不是循环? @Alex Poole。以上是关于在 PLSQL 中查找 dbms_utility.lname_array 类型的 2 个数组之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:DBMS_UTILITY.EXEC_DDL_STATEMENT 与 EXECUTE IMMEDIATE
dbms_utility.exec_ddl_statement 不起作用