Oracle pl sql select*from owner.view1减去select*from owner2.view1作为for循环中的光标

Oracle pl sql select*from owner.view1减去select*from owner2.view1作为for循环中的光标,oracle,plsql,Oracle,Plsql,我得到以下错误。这可能是我正在探索的语法,但我在ii循环中尝试做的事情看起来正常吗?我必须弄清楚如何使用listag函数 多谢各位 在结束循环时生成错误;-第二次 PLS-00103:在预期以下情况之一时遇到符号结束: dbms_output.put_行显示生成了正确的选择。再次感谢。丰富的 谢谢你,Aleksej。表/视图有许多字段。但我想比较的是视图而不是表。这些视图位于两个单独的模式中。这两个模式对象完全相同,我将DBA_A复制到了DBA_B。但是我修改了一个模式中一个视图的基表 从DBA

我得到以下错误。这可能是我正在探索的语法,但我在ii循环中尝试做的事情看起来正常吗?我必须弄清楚如何使用listag函数

多谢各位

在结束循环时生成错误;-第二次

PLS-00103:在预期以下情况之一时遇到符号结束:

dbms_output.put_行显示生成了正确的选择。再次感谢。丰富的

谢谢你,Aleksej。表/视图有许多字段。但我想比较的是视图而不是表。这些视图位于两个单独的模式中。这两个模式对象完全相同,我将DBA_A复制到了DBA_B。但是我修改了一个模式中一个视图的基表

从DBA_A.view1中选择*。。。。从DBA_B.视图1中减去选择*。。。如果我使用硬编码的schema.view名称对select/减号进行硬编码,则可以使用。select返回视图中包含更改数据的一行。我相信有一种方法可以返回循环中视图的所有列名。我希望通过列名列表上的listag和返回的行中的数据来执行dbms_output.putline


如果我不够清楚,我很抱歉。非常感谢您的示例代码。我将根据您的示例修改我的代码并发布我的结果。

试图简化您的问题,只是给您一些关于动态代码的提示

比如说我有几张我想成对比较的桌子;为了简单起见,我使用表来避免rowid问题,并使用相同的模式,只需更改表名。 各表:

DECLARE
CURSOR c1
 IS
   SELECT view_name
   FROM all_views
   WHERE owner = 'DBA_A'
   AND view_name LIKE 'IRV_%'
   OR view_name LIKE 'RD_%'
   ORDER BY view_name;
BEGIN
 FOR i IN c1
 LOOP
   FOR ii IN ('select * FROM DBA_A.' || i.VIEW_NAME || ' minus select *     FROM DBA_B.' || i.VIEW_NAME)
   LOOP
     -- I plan to put the results from the select in the FOR ii loop in a listAgg.  I think I can figure that out.
     dbms_output.put_line(listAgg);
   END LOOP; -- for ii
 END LOOP; -- for i
END;
假设我想比较表_A_1和表_A_2,表_B_1和表_B_2,检查id值;我相信这可以让您了解使用动态SQL的方法:

create table TABLE_A_1(id) as select 1 from dual union all select 2 from dual;
create table TABLE_A_2(id) as select 2 from dual;
create table TABLE_B_1(id) as select 3 from dual union all select 3 from dual;
create table TABLE_B_2(id) as select 4 from dual;
这使得:

declare
    cur sys_refcursor;
    v   number;
begin    
    for tab in ( select table_name from user_tables where regexp_like (table_name, 'TABLE_[AB]_1') ) loop
        open cur for 'select id from ' || tab.table_name || ' minus select id from ' || replace(tab.table_name, '1', '2');
        loop
            fetch cur into v;
            exit when cur%NOTFOUND;
            dbms_output.put_line( tab.table_name || ' minus ' || replace(tab.table_name, '1', '2') || ': ' || v);
        end loop;
    end loop;
end;
注意这里的两个主要简化:

我假设所有的表都有一个字段;在更一般的情况下,必须确保所比较的视图具有相同的结构。 我使用ID来识别丢失的行;在表中,我可以使用rowid,但在视图中,rowid将不起作用,因此您需要找到一种方法来标识另一个视图中缺少的视图中的行。
总而言之,为了给出完整的解决方案,我应该更多地了解您的视图以及您想要用来识别缺失行的方式;如果没有这些信息,本文将包含一些可能对您编写自己的解决方案有用的提示。

您的代码有一些问题,但不清楚您需要做什么,因此很难帮助您。假设您在第一个查询中找到了一个视图,然后进行减号运算,得到10条5列的记录。你想用这些记录做什么?如何处理您事先不知道动态查询将返回哪些列的事实?请试着建立一个帮助别人帮助你的平台。当我只是在任何代码块外执行select…减号…select时,请使用select*owner.view减号select*owner2.view对其进行手动编码。在一个视图中,我在一个模式中更改了基表,select将返回包含所有列的行。我只想获取ii循环中返回的行的rowid,并执行dbms_output.put_linerowid。代码从未进入ii循环。我希望这有帮助。非常感谢。视图的rowid可能重复没有多大意义。谢谢Aleksej,如果答案对您来说是正确的,请接受它。当有人回答你时,你会发现该怎么做。
TABLE_A_1 minus TABLE_A_2: 1
TABLE_B_1 minus TABLE_B_2: 3