2015-10-15 66 views
1

我只想通过仅使用SQL来知道表中插入了多少行。插入了多少行

例如:考虑2个表TT和TT1和我想用TT表像这样插入到TT1:

INSERT INTO TT1 
SELECT * 
FROM TT 
WHERE 1=1; 

上面的说法我想知道有多少行被插入后执行?仅通过使用Oracle SQL。有什么办法吗?

+2

如果'tt1'在此之前为空,则在插入后运行'select count(*)from tt1'。所有其他解决方案将需要使用PL/SQL(所以它不再是“仅SQL”) –

+0

根据API,可以使用get diagnostics row_count之类的东西? – jarlh

回答

1
INSERT INTO TT1 
SELECT * 
FROM TT 
WHERE 1=1; 

插入的行数是由返回的行数选择声明。这只不过是表TT的所有行的计数,因为1=1总是,基本上不过滤任何东西。

所以,只是做:

SELECT COUNT(*) 
FROM TT; 

更新添加了一个例子

例如,

比方说,我有一个表牛逼里面是空的:

SQL> create table t as select * from emp; 

Table created. 

我插入行从EMP牛逼

SQL> insert into t select * from emp; 

14 rows created. 

我想知道有多少行被插入,这只不过是由返回SELECT语句行。

SQL> select count(*) from emp; 

    COUNT(*) 
---------- 
     14 

这是纯粹的SQL。即您执行了插入操作,现在想知道INSERT INTO..SELECT实际插入了多少行。

但是,当你有很多insert语句的程序,即发生在PL/SQL,则需要SQL%ROWCOUNT为每INSERT

+0

上面的select语句给出了TT中存在的总行数。但是我想要插入语句插入了多少行。 – user3074636

+0

@ user3074636当您执行INSERT INTO ..SELECT时,插入到table_2中的行数与table_1上的select所获取的行数相同。查看更新。 –

2

PL/SQL表达式SQL%ROWCOUNT可能会做你想做的。您需要将此语句描述为:

BEGIN 
    INSERT INTO TT1 
    SELECT * 
    FROM TT 
    WHERE 1=1; 

    DBMS_OUTPUT.PUT_LINE('Inserted ' || SQL%ROWCOUNT) 
END; 

换句话说,它需要进入PL/SQL代码块。

0

如果你能够使用PL/SQL,你可以不喜欢它

declare 
    i number; 
begin 
    INSERT INTO TT1 SELECT * FROM TT WHERE 1=1; 
    i := sql%rowcount; 
end; 

否则就我知道的,只有它使用SELECT COUNT做,如果有此查询之前的记录方式只需运行SELECT COUNT两次,一次在执行之前,一次在查询之后,然后仅减去它们。