2015-10-15 35 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兩次,一次在執行之前,一次在查詢之後,然後僅減去它們。