Sql 在Oracle中将查询从合并转换为选择计数

Sql 在Oracle中将查询从合并转换为选择计数,sql,oracle,sql-merge,Sql,Oracle,Sql Merge,我有以下语法的合并查询: MERGE INTO target_table USING source_table ON search_condition WHEN NOT MATCHED THEN INSERT (col1,col2,...) values(value1,value2,...) WHERE <insert_condition>; 您不必单独计算插入的行数。如果在SQL*Plus中运行,它会显示数字本身 如果将

我有以下语法的合并查询:

MERGE INTO target_table 
USING source_table 
ON search_condition
    WHEN NOT MATCHED THEN
        INSERT (col1,col2,...)
        values(value1,value2,...)
        WHERE <insert_condition>;

您不必单独计算插入的行数。如果在SQL*Plus中运行,它会显示数字本身

如果将该合并用作PL/SQL过程的一部分,则应使用SQL%ROWCOUNT:

我将它存储到一个局部变量中,以便以后可以使用它做一些事情,并将它与其他值进行比较。

MERGE语句将源表中的行插入到目标表中。因此,要统计的是源表中的数据,而目标表中还不存在这些数据

select count(*)
from source_table 
where <insert_condition>
and not exists
(
  select *
  from target_table
  where <search_condition>
);

是的,但我不想使用合并查询,因为它需要时间,所以我只想使用选择查询。@Nitin:它需要这么多时间,这不应该是原因。要将数据插入到目标_表中,或者不插入。如果要执行此操作,请使用“合并”,如果只想查看要插入的行数,请使用查询。是的,我想查看要插入的行数,并尝试您给出的查询,但结果不同。Oracle不会撒谎。如果SQL%ROWCOUNT说merge合并了一定数量的行,其中包括INSERT和UPDATE,那么这就是数字。您可以在merge语句之前创建一个保存点,然后将SQL%ROWCOUNT与预期值进行比较,如果插入的行数不正确,然后回滚到保存点。我尝试了上面的查询,但并没有返回预期的结果。这很奇怪。你知道合并会插入,比如说,正好1000行,但我的查询不会返回1000行?你试过了吗?您可以运行MERGE语句,然后回滚。是的,我并行运行查询并得到不同的结果,首先运行查询,然后合并并得到不同的结果。嗯,奇怪。对不起,我对此没有解释。我想你必须显示真实的语句,这样我们才能看到发生了什么。很抱歉,上面的查询运行的是相同的结果,这是我的错误。
declare
  l_cnt number;
begin
  merge into target_table
    using ...;

  l_cnt := SQL%ROWCOUNT;            --> this is what you want

  dbms_output.put_line('Inserted ' || l_cnt || ' rows');
end;
select count(*)
from source_table 
where <insert_condition>
and not exists
(
  select *
  from target_table
  where <search_condition>
);