Capture SQL stmt from ORA-54 2005-07-02 - By Herring Dave - dherri
Is there any way to capture the SQL statement that generates an ORA-54 (See ORA-54.ora-code.com)? I've got a trigger set on my database to capture all possible ORA- errors, but for ORA-54 (See ORA-54.ora-code.com) errors, only the USERNAME, OSUSER, and PROGRAM get captured. I'm running on Oracle 9.2.0.4 on Tru64 5.1. Any help would be appreciated.
Here's the text of my trigger:
CREATE OR REPLACE TRIGGER SYS.AUD_ORA_ERROR_SETG
AFTER SERVERERROR ON DATABASE
WHEN (DBMS_STANDARD.SERVER_ERROR(1) NOT IN (1003,1017,1594,1595,1720)) DECLARE
v_machine VARCHAR2(64);
v_osuser VARCHAR2(30);
v_process VARCHAR2(12);
v_program VARCHAR2(48);
v_sql_stmt VARCHAR2(4000);
v_sql_text ora_name_list_t;
v_tmp_counter PLS_INTEGER;
v_tmp_sql_chunks PLS_INTEGER;
BEGIN
BEGIN
SELECT s.osuser
, s.machine
, p.spid
, s.program
INTO v_osuser, v_machine, v_process, v_program
FROM sys.v_$session s
, sys.v_$process p
WHERE s.sid = (SELECT /*+ FIRST_ROWS(1) */ sid
FROM sys.v_$mystat
WHERE rownum < 2)
AND s.username = ora_login_user
AND s.paddr = p.addr;
EXCEPTION
WHEN no_data_found THEN
v_sql_stmt := '';
END;
IF DBMS_STANDARD.SERVER_ERROR(1) IN (900,1400,1401,1722)
OR DBMS_STANDARD.SERVER_ERROR(1) BETWEEN 900 AND 985 THEN
v_tmp_sql_chunks := ora_sql_txt(v_sql_text);
FOR v_tmp_counter IN 1..v_tmp_sql_chunks LOOP
/*
* Chunks are set at 64K each and since the max VACHAR2 variable is 4000, going beyond
* 63 loops will cause an overflow.
*/
IF v_tmp_counter < 63 THEN
v_sql_stmt := v_sql_stmt || v_sql_text(v_tmp_counter);
ELSE
EXIT;
END IF;
END LOOP;
END IF;
INSERT INTO gmaudit.aud_ora_error_tb VALUES
(DBMS_STANDARD.SERVER_ERROR(1),sysdate,ora_login_user,
gmaudit.ora_error_nbr_seq.nextval,v_osuser,v_machine,v_process,v_program ,v_sql_stmt);
END;
/
Dave
-- ---- ---- ---- ---- ---- ---- ----
Dave Herring, DBA
Acxiom Corporation
3333 Finley
Downers Grove, IL 60515
wk: 630.944.4762
<mailto:dherri@(protected) <mailto:dherri@(protected)> >
-- ---- ---- ---- ---- ---- ---- ----
********************************************************************** The information contained in this communication is confidential, is intended only for the use of the recipient named above, and may be legally privileged. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication is strictly prohibited. If you have received this communication in error, please re-send this communication to the sender and delete the original message or any copy of it from your computer system. Thank You.
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas -microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"> <meta name=Generator content="Microsoft Word 11 (filtered medium)"> <style> <!-- /* Font Definitions */ @(protected) {font-family:r_ansi; panose-1:2 11 6 9 2 2 2 2 2 4;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0in; margin-bottom:.0001pt; font-size:12.0pt; font-family:"Times New Roman";} p.MsoBodyText, li.MsoBodyText, div.MsoBodyText {margin-top:0in; margin-right:0in; margin-bottom:6.0pt; margin-left:0in; font-size:12.0pt; font-family:"Times New Roman";} a:link, span.MsoHyperlink {color:blue; text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed {color:#606420; text-decoration:underline;} p.StyleBodyTextItalic, li.StyleBodyTextItalic, div.StyleBodyTextItalic {margin-top:0in; margin-right:0in; margin-bottom:6.0pt; margin-left:.25in; font-size:10.0pt; font-family:"Times New Roman"; font-style:italic;} span.EmailStyle19 {mso-style-type:personal-compose; font-family:Arial; color:windowtext;} @(protected) Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in;} div.Section1 {page:Section1;} --> </style>
</head>
<body lang=EN-US link=blue vlink="#606420">
<div class=Section1>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt; font-family:Arial'>Is there any way to capture the SQL statement that generates an ORA-54 (See ORA-54.ora-code.com)? I've got a trigger set on my database to capture all possible ORA- errors, but for ORA-54 (See ORA-54.ora-code.com) errors, only the USERNAME, OSUSER, and PROGRAM get captured. I'm running on Oracle 9.2.0.4 on Tru64 5.1. Any help would be appreciated.<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt; font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt; font-family:Arial'>Here's the text of my trigger:<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt; font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>CREATE OR REPLACE TRIGGER SYS.AUD_ORA_ERROR_SETG<o:p></o:p> </span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> AFTER SERVERERROR ON DATABASE<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; WHEN (DBMS_STANDARD.SERVER_ERROR(1) NOT IN (1003,1017,1594,1595,1720)) DECLARE<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_machine VARCHAR2(64);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_osuser VARCHAR2(30);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_process VARCHAR2(12);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_program VARCHAR2(48);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_sql_stmt VARCHAR2(4000);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_sql_text ora_name_list_t;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_tmp_counter PLS_INTEGER;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_tmp_sql_chunks PLS _INTEGER;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>BEGIN<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> BEGIN<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> SELECT s.osuser<o:p></o:p>< /span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; , s.machine<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; , p.spid<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; , s.program<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> INTO v_osuser, v _machine, v_process, v_program<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> FROM sys.v_ $session s<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; , sys.v_$process p<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> WHERE s.sid = (SELECT /*+ FIRST_ROWS(1) */ sid<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; FROM sys.v_$mystat<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; WHERE rownum < 2)<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> AND s .username = ora_login_user<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> AND s .paddr = p.addr;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> EXCEPTION<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> WHEN no_data_found THEN<o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_sql_stmt := '';<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> END;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> IF DBMS_STANDARD.SERVER_ERROR(1) IN (900,1400 ,1401,1722)<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> OR DBMS_STANDARD.SERVER _ERROR(1) BETWEEN 900 AND 985 THEN<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> v_tmp_sql_chunks := ora_sql _txt(v_sql_text);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> FOR v_tmp_counter IN 1..v _tmp_sql_chunks LOOP<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>/*<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> * Chunks are set at 64K each and since the max VACHAR2 variable is 4000, going beyond<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> * 63 loops will cause an overflow.<o:p></o:p></span>< /font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> */<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> IF v_tmp _counter < 63 THEN<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>   ; v_sql_stmt := v_sql_stmt || v_sql_text(v_tmp_counter);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> ELSE<o:p>< /o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> EXIT;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> END IF;<o :p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> END LOOP;<o:p></o:p></span>< /font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> END IF;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> INSERT INTO gmaudit.aud_ora_error_tb VALUES<o :p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> (DBMS_STANDARD.SERVER_ERROR(1),sysdate ,ora_login_user,<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'> gmaudit.ora_error_nbr_seq.nextval,v_osuser,v_machine,v_process,v_program,v_sql _stmt);<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>END;<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=1 face="r_ansi"><span style='font-size:8.0pt; font-family:r_ansi'>/<o:p></o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt; font-family:Arial'><o:p> </o:p></span></font></p>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt; font-family:Arial'>Dave</span></font><o:p></o:p></p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'>-- ---- ---- ---- ---- ---- ---- ----< /span></font><o:p></o:p></p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'>Dave Herring, DBA</span></font><o:p></o:p> </p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'>Acxiom Corporation</span></font><o:p></o:p ></p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'>3333 Finley</span></font><o:p></o:p></p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'>Downers Grove, IL 60515</span></font><o:p> </o:p></p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'>wk: 630.944.4762</span></font><o:p></o:p>< /p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'><</span></font><font face=Arial><span style='font-family:Arial'><a href="mailto:dherri@(protected)"><font size=2 color=teal><span style='font-size:10.0pt;color:teal'>mailto:dherri@(protected)< /span></font></a></span></font><font size=2 color=teal face=Arial><span style='font-size:10.0pt;font-family:Arial; color:teal'>></span></font><o:p></o:p></p>
<p class=MsoNormal><font size=2 color=teal face=Arial><span style='font-size: 10.0pt;font-family:Arial;color:teal'>-- ---- ---- ---- ---- ---- ---- ----< /span></font><o:p></o:p></p>
<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size: 12.0pt'><o:p> </o:p></span></font></p>
</div>
<FONT SIZE=3><BR> <BR> **********************************************************************<BR> The information contained in this communication is<BR> confidential, is intended only for the use of the recipient<BR> named above, and may be legally privileged.<BR> If the reader of this message is not the intended<BR> recipient, you are hereby notified that any dissemination, <BR> distribution, or copying of this communication is strictly<BR> prohibited.<BR> If you have received this communication in error,<BR> please re-send this communication to the sender and<BR> delete the original message or any copy of it from your<BR> computer system. Thank You.<BR> </FONT> </body>
</html>
|
|