當前位置:首頁 » 服務存儲 » oracle存儲過程監控預警
擴展閱讀
好看移動硬碟 2022-08-12 23:00:55
杭州前端外包 2022-08-12 22:57:10

oracle存儲過程監控預警

發布時間: 2022-07-05 16:08:46

㈠ oracle 存儲過程中出現異常的處理

異常是執行這個存儲過程出的異常吧,那就是說只有執行一次這個存儲過程才會拋一次異常么?如果這樣我建議你可以再寫個存儲過程來調用你這個存儲過程,這樣來記錄異常的次數。然後再進行處理!

㈡ oracle存儲過程,怎麼控制是否做異常處理。

動態sql可以做吧。
exception外面參數判斷,走不走exception在動態sql里做。
另外我想問下,exception不是會導致程序中斷退出嗎?為什麼不在exception里做參數判斷呢?當不需要走exception的時候,將異常處理設置為 null;,需要的話就走異常處理。

㈢ oracle 存儲過程異常處理

先建一個錯誤跟蹤表
create sequence s_error_id;
CREATE TABLE ERROR_RECORD
(
ERROR_ID NUMBER(10) primary key,
ERROR_CODE NUMBER(10),
ERROR_MSG VARCHAR2(2000),
ERROR_DATE DATE,
ERROR_PROGRAM VARCHAR2(200)
);
--------在過程的例外里向跟蹤表寫入錯誤信息:
create or replace procere day_task is
v_sqlcode ERROR_RECORD.ERROR_CODE%type;
v_msg ERROR_RECORD.error_msg%type;
begin
------program body
exception when others then
--記錄錯誤信息表
v_sqlcode :=sqlcode;
v_msg :=sqlerrm;
insert into error_record(error_code,error_msg,error_date,error_program)
values (v_sqlcode,v_msg,sysdate,『day_task』);
end;

㈣ 如何監控Oracle資料庫中長時間運行的進程

監控Oracle 資料庫中長時間運行進程的兩種方式,通過這些方 法,我們可以監控單條語句的 長時間操作,監控存儲過程的運行進度,甚至自己'生成'進度信息. 關鍵詞:監控進度V$SESSION_LONGOPS 當Oracle 存儲過程運行時間較長時,我們希望客 戶端能了解到它在後台執行的狀況或者進度信息(類 似WINDOWS 安裝軟體時的進度條信息),這樣可以知 道運行在後台的應用進程是否終止或者休眠,更近一 步要求,最好能知道進行到哪一步驟,還有多少時間才 能完成. 簡單到一條SQL 語句的情況,如果執行時間較長, 我們如何得到它的運行狀況?是否後台還在運行?雖 然可以查看SQL 的執行計劃了解它的執行步驟,但如 何知道它運行到哪一個步驟了呢?如何才能估計出它 的合理的較為精確的執行時間呢? Oracle 資料庫前端發出執行命令後,進程在後台 執行,普通開發人員一般無法了解到後台在做什麼,一 般採用的方法是用DBMSOUTPUT.PUT_LINE 來列印出 來,但DBMS—OUTPUT.PUT—LINE 列印的信息受緩沖區 大小限制,如果信息較多就容易溢出,而且如果存儲過 程執行時間較長,只有在其執行完後,這些信息才會打 印出來,這就增加了調試周期,影響了調試效果.有的 開發人員在存儲過程中通過寫日誌表的形式來記錄進 度,但需要COMMIT 後其他進程才能看到這些日誌信 息,而在某些控制結構中(如游標CURSOR 循環)COM— MIT,則很容易引起ORA 一01555 錯誤,造成程序出錯. 下面介紹兩種監控方法. 如何監控單條長語句從ORACLE8 開始,出現一個新的動態視圖:V $SESSION_LONGOPS,從這個視圖可以獲知一些操作 (如全表掃描,並行查詢,RMAN,排序等)的執行進度, 我們先來了解一下V$SESSION—LONGOPS 視圖的一些 重要欄位: 列說明 sID 會話標識 5ERIAL#會話序列號 OPfE 操作的簡短描述 TARG 盯操作的對象,如xx TAR~_DESC目標描述 SOFAR 目前已執行單位數目 ToTAIWORK 總單位數目 UNlTS 單位 START_TIME 開始執行時間 LAST_ UPDATE_TIME 統計數據最後更新時間 TIME_ REMAINING 估計剩餘時間c ELAPSED_SECONDS 已執行時間(秒) MEsSAGE 統計數據匯總信息 USERA^^E 用戶名 ~L_ADDRES5 語句的地址,,用於和V$sql_text 等關聯 語句的hash 地址,用於和V$sql_texlSQLHASH VALUE等關聯 這個動態視圖顯示各個運行時間超過6 程.這些進程包含許多備份和恢復功能,統計數據收集,查詢等. 執行以下語句就可以得到資料庫中各個長時間操 作的進程信息: select'Icfromv$sesslon_ longopswheretime_ re- malnlng>0 我們也可以用圖形化工具查看,如TOAD,OEM中 均可查看長操作進程進度信息. Oracle 自帶的管理工具OracleEnterpriseManager (OEM)提供了圖形化查看長操作的功能,如: 計算機系統應用2007 Quest公司的資料庫管理工具TOAD 也可以看到 長操作信息,如: 表的統計信息. 長時問運行的SQL 語句可以用V$SESSION—LON? 為了能監控到查詢進程執行的進度,必需使用 CBO 優化器並且: 設置TlMED—STATISTICS或者SQL—TRACE 用ANALYZE語句或者DBMS—STAT 包收集相關 108 實踐經驗P 帕cficalExpen GOPS來監控.實際上,長時間運行的存儲過程也可以 監控.那是否任何操作都可以通過這個視圖來監控進 度呢?很遺憾,V$SESSION—LONGOPS 只會報告它認為 耗時長的操作.對於NEsTEDLOOP/UNIQUEINDEX READS/INDEXRANGEScANS 等執行速度很快的操作, 2007 期計算機系統應用由於它們執行一般不超過6 秒,因此將不會出現在V $SESSION—LONGOPS 如何監控自定義存儲過程單條長語句可以用上面的方法監控,Oracle 動生成V$SE.SSION— LONGOPS 記錄.那麼存儲過程中 有許多小操作,如何監控進度呢?其實,我們也可以手 工生成V$SESSION—LONGOPS 記錄,方法是調用DBMS APPLICATION—INFO 包來生成自定義進度信息. 從Oracle7.2 開始,提供了DBMS—APPLICATION— INFo 包,通過調用這個包,應用可以將自己的名字和 動作填寫到V$SESSION 和V$SQLAREA 的MODULE ACTION列中.V$SESSION 列出每個會話的用戶名,操 作系統機器名,終端名,程序名等. 應用可以在執行模塊時設置模塊名和動作名,模 塊名一般是甩戶自定義的.而動作名一般描述模塊中 的當前執行的事務的名字. DBMSAPPLICATION_INFO 包包含以下過程 SET_ MODULE 設置當前運行程序的模塊名 SET__AEl'ION 設置當前模塊的當前動作名 SESSION—LON-在V$SESSIONLONGOPS視圖中 GoPS 插入一行進度信息 SETMODULE過程設置模塊名和動作名: createorreplaceproceredel—cust(v_cust—Id varchar2) begindbms—— application—— info.set— mole(mole—— name=>"delcust". actlon_name=>"deletetablecust)i deletefromcustwherecustld=v_ cusLId; dbms_appllcatlon— Info.seLmole(,); end;以上設置的模塊名和動作名可以通過查詢V $sqlarea 獲取. 如:selectsql—text,mole,actionfromv $sqlareawheremole="del_cust: sql_textmoleadion Deletefr0mcustdel_ custdeletetableoust 1rowselected. SET_SESSION—LONGOPS 過程用於在V$session— longops 中插入一行,開發人員可以調用此過程設置長 時間操作的狀態信息,這樣,任何其他其他會話都可以 看到這個進度信息.如下例所示: declare _info.set_ session— Iongops_ nohint; IdndexnumberdefaultInohlnt: slnonumber;begin forlIn1..8888888888 loop update....; dbms_ appllcaflon— Info.setsesslon_ longops (rlndex=>l_rlndex, slno=>I_slno. op_name=>"updateahugetable. target=>126, target_desc=>'.msgdescription context=>0.sOfar=>j. totalwork=>8888888888. units=>loops endloop;end; 然後,從另一個會話來執行以下語句selectfromv$sesslon_ longopswheretlmere? malnlng>0; 也可以用圖形化工具TOAD 或OEM來查看. 因此,採用本文說明的方法,Oracle 開發人員可以 比較方便的監控長操作進程的進度信息,也可以自己 設置監控信息,來了解後台存儲過程的運行效率.甚 至,可以在存儲過程或SQL 語句提交執行後馬上觀察 其執行進度,如果比較緩慢,則可以中斷其執行,進行 調優,從而縮短調試周期,提高開發效率.

㈤ oracle存儲過程異常信息

begin
[sql code]
exception
when others then
rollback;
v_err:=sqlerrm; --這里接收異常信息
end;

㈥ 請教各位高手 oracle 存儲過程 如何將獲得捕獲異常的內容寫入一張表裡

總結起來你的問題就是在sqlerrm這個內置函數上,它應該被變數賦值,這樣才能使用,SQL語句中,不能直接使用,sqlerrm,SQLcode這種

㈦ Oracle 存儲過程怎麼拋出異常

你說的異常是什麼意思?如果是,執行中的錯誤,那麼可以用「調試」,不過需要有一個系統許可權的擁護才能調試,許可權好象是什麼debug XXXXX。
如果說的是有時執行因為這樣那樣的數據問題出現的異常,那麼一般都是通過exception來拋出異常的,這樣的拋出的異常,你可以自己編代碼,然後輸入一張表內,這樣就可以捕獲異常了。如果1表示沒有主鍵,2表示數據超長等等。具體的寫法網上很多,這里就不寫了。

㈧ oracle如何捕獲存儲過程報錯是哪一行

如果資料庫是10g及以上版本,可以使用dbms_utility.format_error_backtrace(),這個函數能夠返回錯誤行,可以套用以下格式:
create or replace procere prc_test(參數) is
v_no number;
begin
select no into v_no from zrp;
exception
when others then
dbms_output.put_line('SQL CODE:'||sqlcode||chr(10)||
sqlerrm||chr(10)||
dbms_utility.format_error_backtrace());
end;
這樣寫的好處是,當程序發成異常,唄exception捕獲後,就會列印出錯誤信息及發生錯誤的行號

㈨ ORACLE 存儲過程是什麼 它的用處,好處是什麼概念性的東西多點。。

定義:存儲過程(Stored Procere )是一組為了完成特定功能的SQL 語句集,經編譯後存儲在資料庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。
存儲過程是由流控制和SQL 語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中,應用程序使用時只要調用即可。在ORACLE 中,若干個有聯系的過程可以組合在一起構成程序包。
優點:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.當對資料庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少資料庫開發人員的工作量。
4.安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。

簡單說,你在你的機器上寫了個存儲過程,這個存儲過程像那些表裡的數據一樣被放在遙遠的資料庫伺服器當中,但是它又是可執行的代碼,其他能連到資料庫伺服器的用戶,可以調用你寫的存儲過程
它的作用是隱藏細節,就是說,你寫的存儲過程代碼可能很復雜,但是其他人調用它卻很簡單,不用具體知道它是如何做的,且一次能完成多個指令

oracle有系統存儲過程和自定義存儲過程2種存儲過程。
系統存儲過程就是由oracle預先提供的一組完成特定功能的存儲過程,安裝完oracle就有了。
自定義存儲過程就是存在oracle資料庫里由一組plsql語句組成的自定義過程(procere)。它可以供其它oracle自定義存儲過程、自定義函數和job調用或者由客戶端程序調用。

㈩ Oracle 怎麼監控存儲過程的運行情況

select t.sql_id,
t.sql_text,
s.plan_hash_value,
s.optimizer_cost,
s.executions_total,
s.elapsed_time_total,
s.disk_reads_total,
s.buffer_gets_total
from DBA_HIST_SQLSTAT s, DBA_HIST_SQLTEXT t
where s.sql_id=t.sql_id
and t.sql_text like'%存儲過程名稱%';

沒有想到其他好辦法,確實不太好查了,把存儲過程當作SQL來查找吧。