在 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 不起作用

在plsql中的以下数据中查找重叠

PLSQL:在 xml 中查找标签值并将其替换为标签名称以创建示例数据

plsql数据库查找完表直接在表上修改怎么弄

C# & PLSQL - 通过正则表达式查找注释和字符串