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>
);