2012-09-08 133 views
2

免責聲明:我沒有太多的SQL經驗,我不知道我公司正在使用的Oracle的版本。從多個更新查詢中返回一條「記錄更新」

我有明天需要更新的產品價格表。有幾千條記錄會被更新,但仍有一千條記錄會不變。

現在我有一條每條記錄的更新聲明,雖然我可以將它們全部作爲腳本運行,但我想獲得關於有多少條記錄被更新的反饋,並且如果可能的話,哪些語句失敗。

如果我運行了腳本,我最終將得到一些5,000「1行更新」的消息,但如果我看到「0行更新」,則不知道哪一個失敗。

是否有某種形式的腳本可以用來捕捉失敗,或者至少收集更新到一個總數的行數?

回答

5

您的產品價格表是否有某種修改日期或最後修改的字段?如果是這樣,請確保你正在更新這些。另外,如果使用你的腳本,你應該設置回顯和後臺處理日誌文件。您的腳本應該是這個樣子:

-- updates.sql 
set serveroutput on 
set echo on 
WHENEVER SQLERROR EXIT SQL.SQLCODE 
spool on 
spool updates.log 

-- put updates here 

commit; 
spool off 

登錄到sqlplus中從同一目錄作爲該文件,並使用運行:@ updates.sql

的updates.log文件將有每個運行的語句。

如果您想從單獨的更新語句列表中獲取總數,則每次更新後都需要檢查SQL%ROWCOUNT。類似的信息(未經測試):

declare 
    l_total pls_integer := 0; 
begin 
    update product set x = 'foo' where y='bar'; 
    l_total := l_total + SQL%ROWCOUNT; 

    update product set x = 'blah' where y='someval'; 
    l_total := l_total + SQL%ROWCOUNT; 

    commit; 
    dbms_output.put_line(l_total); 
end 
/

這是一個基本的PL/SQL匿名塊,並且可以與上述滑閥策略中使用。

最後,設置一個基本的日誌表,其中包含消息字段,日誌日期時間,一些上下文字段(消息來自何處等),msg類型(日誌,錯誤)等。一個處理插入日誌表(自治事務)的過程,然後在需要跟蹤統計數據或任何其他數據(dbms_output非常有限)時使用日誌過程。你的環境可能已經有了這樣的東西,你只需要尋找它(或者問你公司的高級開發人員)。

+0

今天我只用你的第一個例子來進行更新,它完美地工作。另外,我們一定會在下次團隊會議上提出日誌表的主意。如果我們沒有一個,它會很高興。 – Logarr

+0

@記者好聽。如果您想要一個簡單的日誌表和過程示例,請參閱http://stackoverflow.com/questions/4919437/dbms-output-put-line – tbone

相關問題