FORMAT_CALL_STACK
Hi all,
can anybody help me to extract procedure name outof DBMS_UTILITY.FORMAT_CALL_STACK . ?
thanx in advance.
Perhaps, technical problem leads op to this disaster. I mean to say three duplicate post. ;)
Regards.
Satyaki De.
Similar Messages
-
DBMS_UTILITY.FORMAT_CALL_STACK
Hi All,
Could you one tell me when i am running DBMS_UTILITY.FORMAT_CALL_STACK, i am getting one environment 11 alpha numeric character(0x3a135c3a8) for object handle and in another environment is giving 16 alpha numeric character(00000007A6B3ED30) for object handle.
One Enviroment:
begin
dbms_output.put_line(DBMS_UTILITY.FORMAT_CALL_STACK);
end;
----- PL/SQL Call Stack -----
object line object
handle number name
0x3a135c3a8 2 anonymous block
Another Enviroment:
----- PL/SQL Call Stack -----
object line object
handle number name
00000007A6B3ED30 2 anonymous block
Could any one explain why the difference.
Thanks11gR2 is not a version number; it is a marketing label. 11.2.0.3 is a proper version number.
Are both environments the same bitmode? Are both Oracle environments housed on the same OS version?
What difference does it make if the handle length is different since the basic format of the data returned is the same? Are you trying to parse the call stack? If so, your logic should not depend on fixed lengths but should locate value beginning and ending value locations.
HTH -- Mark D Powell -- -
Any alternatives for dbms_utility.format_call_stack?
For the freaks out there:
isn't there an alternative for dbms_utility.format_call_stack, since this will not work in server-side pl/sql when called from Oracle Forms. I'm searching something like a Data Dictionary View where I can retrieve this kind of information.
Regards, RoelI am having the same problem.
I need a way to trace the path, even when the code is called from Forms.
Any ideas?? -
Hi,
If I call procedure through DB_LINK, FORMAT_CALL_STACK return nothing.
Can I somehow to define the name of procedure, that call me?I am having the same problem.
I need a way to trace the path, even when the code is called from Forms.
Any ideas?? -
How to get value and name of the n'th parameter in a pl/sql funct./proced.
procedure test(name varchar2, birthdate date, zip number, country varchar2);
in procedure x I do
test('Michael Postmann', to_date('03.01.1983', 'DD.MM.YYYY'), 7461, 'AUSTRIA');
And this should htp.print the following:
test: name=Michael Postmann,birthdate=1983/01/03,zip=7461,country=AUSTRIA
In procedure test I want to know:
*) What is the name of myself (the procedure)
*) Optionally: Am I a procedure or a function?
*) How many Parameters do I have?
*) What are the values of them?
*) What are the names of them?
*) Optionally: What are the types of them?
What I actually want to do is:
I have a procedure for logging errors. So in my program I call this function frequently and I want it to log the current time, a string passed to the logging function, the client's ip, etc.... but it should also log a list of the parametrs and values of the procedure/function where the error occoured.
Is there any way to do this (I think in C this is done by argc and argv, but a string containing all the information (as you get it from the WebDb when something goes wrong) would be enough)?
Thx in advance,
Nomike aka Michael PostmannName of procedure or function can be retrieved using DBMS_UTILITY.FORMAT_CALL_STACK:
CREATE OR REPLACE FUNCTION fn_whoami (v_in varchar2)
RETURN varchar2
AS
v_stack varchar2(1000) DEFAULT DBMS_UTILITY.FORMAT_CALL_STACK;
v_job varchar2(500);
v_name varchar2(100);
BEGIN
v_job := SUBSTR(v_stack,INSTR(v_stack,'function'),256);
v_name := SUBSTR(v_job,1,INSTR(v_job,CHR(10))-1);
return v_name;
END fn_whoami;
select fn_whoami('1') from dual;
CREATE OR REPLACE PROCEDURE pr_whoami
AS
v_stack varchar2(1000) DEFAULT DBMS_UTILITY.FORMAT_CALL_STACK;
v_job varchar2(500);
v_name varchar2(100);
BEGIN
v_job := SUBSTR(v_stack,INSTR(v_stack,'procedure'),256);
v_name := SUBSTR(v_job,1,INSTR(v_job,CHR(10))-1);
dbms_output.put_line(v_name);
END pr_whoami;
exec pr_whoami; -
How to find out which job is calling package
Respected sir,
How to find out which job is calling my package. Please help me regarding this.
Regards,
user570124Please read about [url http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_util.htm#i997163]DBMS_UTILITY.FORMAT_CALL_STACK in the manual.
or [url http://asktom.oracle.com/tkyte/who_called_me/index.html]this routine from Tom Kyte may be what you are looking for.
Regards,
Rob. -
Error 420 "Can't call builtin routines remotely" while compiling a proc
I get the message above when I try to compile a Forms procedure with a call to specific functions in the DBMS_UTILITY package. I am using Forms 10.1.2.2.0 and 10g DB (10.2.0.4.0). I want to trace the PL/SQL path that my Forms application is taking and be able to report the line number of the failure when an exception is thrown. I am able to call some routines within the DBMS_UTILITY package, but not any of them that have "pragma interface (C, format_error_stack);" in the code. These include format_call_stack, format_error_stack, and format_error_backtrace; all of which I would like to use. I've tried creating my own DB package function to act as a wrapper; this allows me to compile the form, but the call to the function form my exception handler returns null. These are really useful functions, but I do need to be able to access the functionality from within Forms. Does anyone have a solution/workaround for this problem. Note, this is similar to the question in Link:[ http://forums.oracle.com/forums/thread.jspa?messageID=504922��]
Thanks JK.Nope, that does not work. See my first post above. I've tried using a wrapper, and whilst this allows my forms procedure to compile and my form to run, the wrapper procedure is returning null. Here's some code that may help to explain where I'm at. In the form, I've got -
DECLARE
l_bt VARCHAR2(2000); -- BackTrace
BEGIN
JEK_Raise_Exception; -- This is a DB procedure
EXCEPTION
WHEN OTHERS THEN
l_bt := KEYOWNER.Backtrace.generate_backtrace;
message('l_bt = '||l_bt); pause;
END;-- Then a DB procedure that just generates an exception
CREATE OR REPLACE PROCEDURE JEK_Raise_Exception IS
BEGIN
RAISE too_many_rows;
END;-- and the function from my Backtrace Package to return the backtrace data.
FUNCTION generate_backtrace
RETURN VARCHAR2
IS
l_bt VARCHAR2(2000);
BEGIN
l_bt := DBMS_UTILITY.format_error_backtrace;
RETURN l_bt; -- In my testing so far this has been NULL!!!
END; -
Mail needs to be sent after updating the salary column of emp table
Hi,
we have table test_emp_table, oracle form based application is running on this table...
it conatins salary column, we have requirement that, when every any update to the salary column, a mail needs to be sent to concerned person with new and old salary values..
I did that using the following procedure...
===========
-- Create Temporary Table to hold the Updated values
create table email_parameters
( id number primary key,
oldsal varchar2(10),
newsal varchar2(10),
ename varchar2(100));
--- Create Procedure
CREATE OR REPLACE PROCEDURE send_email_new (
l_job IN NUMBER ) is
l_oldsal varchar2(100);
l_newsal varchar2(100);
l_emp_name varchar2(100);
l_message varchar2(100);
BEGIN
SELECT oldsal
INTO l_oldsal
FROM email_parameters
WHERE ID = l_job;
SELECT newsal
INTO l_newsal
FROM email_parameters
WHERE ID = l_job;
SELECT ename
INTO l_emp_name
FROM email_parameters
WHERE ID = l_job;
l_message:=
'Employee Name= '
|| l_emp_name
|| chr(10)||chr(10)
|| 'Old Salary= '
|| l_oldsal
|| chr(10)||chr(10)
|| 'New Salary= '
|| l_newsal;
send_mail(l_message);
DELETE FROM email_parameters
WHERE ID = l_job;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_call_stack);
END;
--- Create Trigger
create or replace trigger send_email_trg
after update on TEST_EMP_TABLE
for each row
declare
l_job number;
begin
dbms_job.submit (job => l_job,
what => 'send_email_new(job);' );
insert into email_parameters
values (l_job, :old.sal,:new.sal,:new.ename);
end send_email_trg;
-- Create Procedure for Sending Mail
create or replace procedure send_mail(l_message varchar2) is
c utl_smtp.connection;
PROCEDURE send_header(name VARCHAR2, header VARCHAR2) AS
BEGIN
utl_smtp.write_data(c,name ||':'|| header || UTL_TCP.CRLF);
END;
BEGIN
c := utl_smtp.open_connection('192.168.0.18');
utl_smtp.helo(c, 'abc.com');
utl_smtp.mail(c, '[email protected]');
utl_smtp.rcpt(c, '[email protected]');
utl_smtp.open_data(c);
send_header('From', '[email protected]');
send_header('To', '[email protected]');
send_header('Subject', 'Warning: Employee Solary has been updated!');
utl_smtp.write_data(c, UTL_TCP.CRLF || l_message);
utl_smtp.close_data(c);
utl_smtp.quit(c);
EXCEPTION
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
BEGIN
utl_smtp.quit(c);
EXCEPTION
WHEN utl_smtp.transient_error
OR utl_smtp.permanent_error THEN
NULL;
END;
raise_application_error(-20000, SQLERRM);
END;
====================
But I have doubt, if there is any problem with mail server, if user is updating salary column from form based application at same time....
will table trigger allows him to save the new record or not????? or will he get any errors????thanks justin...
I have written that code..but it works...problem is ...i am not able to understand the flow...what happens in the order, until mail is sent...
i have another code.....
I have written with out dbms_job, i have witten directly in the trigger itself...
Tom suggested the procedure, what i have given above..but not the below procedure....
I am not able to understand, what is the difference between them.....
CREATE OR REPLACE TRIGGER test_emp_table_trg
AFTER UPDATE
ON test_emp_table
FOR EACH ROW
WHEN (NEW.sal <> OLD.sal)
DECLARE
l_employee_name VARCHAR2 (240);
l_old_sal VARCHAR2 (240);
l_new_sal VARCHAR2 (240);
l_message VARCHAR2 (240);
BEGIN
/* Gets the employee full name */
BEGIN
SELECT ename
INTO l_employee_name
FROM test_emp_table
WHERE empno = :OLD.empno;
EXCEPTION
WHEN OTHERS
THEN
l_employee_name := NULL;
END;
/* Gets the old Salary */
BEGIN
SELECT sal
INTO l_old_sal
FROM test_emp_table
WHERE empno = :OLD.empno;
EXCEPTION
WHEN OTHERS
THEN
l_old_sal := 0;
END;
/* Gets the new position name */
BEGIN
SELECT sal
INTO l_new_sal
FROM test_emp_table
WHERE empno= :NEW.empno;
EXCEPTION
WHEN OTHERS
THEN
l_new_sal := 0;
END;
l_message:=
'Employee Name= '
|| l_employee_name
|| 'Old Salary= '
|| l_old_sal
|| 'New Salary= '
|| l_new_sal;
BEGIN
send_mail (l_message);
END;
==========
can you please describe it clearly???
thanks in advance my dear friend????
Edited by: oraDBA2 on Oct 4, 2008 10:26 PM -
How to get the current schema name
Hi,
Can anybody please tell me how to get the current schema name, there is some inbuilt function for this,but i am not getting that. Please help me.
Thanks
Jogeshok folks, I found the answer at Tom's as usual.
http://asktom.oracle.com/tkyte/who_called_me/index.html
I rewrote it into a function for kicks. just pass the results of DBMS_UTILITY.FORMAT_CALL_STACK to this function and you will get back the owner of the code making the call as well some extra goodies like the name of the code and the type of code depending on the parameter. This ignores the AUTHID CURRENT_USER issues which muddles the schemaid. Quick question, does the average user always have access to DBMS_UTILITY.FORMAT_CALL_STACK or does this get locked down on some systems?
cheers,
paul
create or replace
FUNCTION SELF_EXAM (
p_call_stack VARCHAR2,
p_type VARCHAR2 DEFAULT 'SCHEMA'
) RETURN VARCHAR2
AS
str_stack VARCHAR2(4000);
int_n PLS_INTEGER;
str_line VARCHAR2(255);
found_stack BOOLEAN DEFAULT FALSE;
int_cnt PLS_INTEGER := 0;
str_caller VARCHAR2(30);
str_name VARCHAR2(30);
str_owner VARCHAR2(30);
str_type VARCHAR2(30);
BEGIN
str_stack := p_call_stack;
-- Loop through each line of the call stack
LOOP
int_n := INSTR( str_stack, chr(10) );
EXIT WHEN int_cnt = 3 OR int_n IS NULL OR int_n = 0;
-- get the line
str_line := SUBSTR( str_stack, 1, int_n - 1 );
-- remove the line from the stack str
str_stack := substr( str_stack, int_n + 1 );
IF NOT found_stack
THEN
IF str_line like '%handle%number%name%'
THEN
found_stack := TRUE;
END IF;
ELSE
int_cnt := int_cnt + 1;
-- cnt = 1 is ME
-- cnt = 2 is MY Caller
-- cnt = 3 is Their Caller
IF int_cnt = 1
THEN
str_line := SUBSTR( str_line, 22 );
dbms_output.put_line('->' || str_line);
IF str_line LIKE 'pr%'
THEN
int_n := LENGTH('procedure ');
ELSIF str_line LIKE 'fun%'
THEN
int_n := LENGTH('function ');
ELSIF str_line LIKE 'package body%'
THEN
int_n := LENGTH('package body ');
ELSIF str_line LIKE 'pack%'
THEN
int_n := LENGTH('package ');
ELSIF str_line LIKE 'anonymous%'
THEN
int_n := LENGTH('anonymous block ');
ELSE
int_n := null;
END IF;
IF int_n IS NOT NULL
THEN
str_type := LTRIM(RTRIM(UPPER(SUBSTR( str_line, 1, int_n - 1 ))));
ELSE
str_type := 'TRIGGER';
END IF;
str_line := SUBSTR( str_line, NVL(int_n,1) );
int_n := INSTR( str_line, '.' );
str_owner := LTRIM(RTRIM(SUBSTR( str_line, 1, int_n - 1 )));
str_name := LTRIM(RTRIM(SUBSTR( str_line, int_n + 1 )));
END IF;
END IF;
END LOOP;
IF UPPER(p_type) = 'NAME'
THEN
RETURN str_name;
ELSIF UPPER(p_type) = 'SCHEMA.NAME'
OR UPPER(p_type) = 'OWNER.NAME'
THEN
RETURN str_owner || '.' || str_name;
ELSIF UPPER(p_type) = 'TYPE'
THEN
RETURN str_type;
ELSE
RETURN str_owner;
END IF;
END SELF_EXAM; -
How to find out what code called the procedure
Hi,
I'm doing an error logging api, that will log errors when it's called. What I wasn't to know is if there's a way to find out what procedure/function called the api?
One way is to pass the function as a text variable but it would be cool if the api could find out who called it.
Hope i made myself clear :-)I think you can use DBMS_UTILITY.FORMAT_CALL_STACK (I assume that's also what Tom K is using in his utility - with a nice wrapper around it).
Look at this example:
SQL>CREATE OR REPLACE procedure p as
2 begin
3 dbms_output.put_line(dbms_utility.format_call_stack);
4 end;
5 /
Procedure created.
SQL>CREATE OR REPLACE procedure p2 as
2 begin
3 p;
4 end;
5 /
Procedure created.
SQL>CREATE OR REPLACE procedure p3 as
2 begin
3 p2;
4 end;
5 /
Procedure created.
SQL>exec p3;
----- PL/SQL Call Stack -----
object line object
handle number name
38aad05a8 3 procedure HRM.P
38aaa6990 3 procedure HRM.P2
38aa9f470 3 procedure HRM.P3
38a6e9d88 1 anonymous block
PL/SQL procedure successfully completed.
SQL> -
Hello to everyone.
Does somebody know how i can get the stored procedure which is
inserting or updating a table? I have many procedures inserting
rows in a table, and i want to identify which of them is adding
records.
I hope somebody can help me.
Thanks a lot.
Hazael Dorantes.
System AnalistSQL> CREATE TABLE audit_table
2 (table_name VARCHAR2 (30),
3 owner_name VARCHAR2 (30),
4 procedure_name VARCHAR2 (30))
5 /
Table created.
SQL> CREATE OR REPLACE TRIGGER insert_dept_trig
2 AFTER INSERT ON dept
3 DECLARE
4 v_owner_name VARCHAR2 (30) := NULL;
5 v_procedure_name VARCHAR2 (30) := NULL;
6 v_call_stack VARCHAR2 (4096) := NULL;
7 BEGIN
8 IF INSTR (DBMS_UTILITY.FORMAT_CALL_STACK, 'procedure') > 0
9 THEN
10 v_call_stack :=
11 SUBSTR (DBMS_UTILITY.FORMAT_CALL_STACK,
12 INSTR (DBMS_UTILITY.FORMAT_CALL_STACK,
13 'procedure') + 10);
14 v_owner_name :=
15 SUBSTR (v_call_stack, 1,
16 INSTR (v_call_stack, '.') - 1);
17 v_procedure_name :=
18 SUBSTR (v_call_stack,
19 INSTR (v_call_stack, '.') + 1, 30);
20 v_procedure_name :=
21 SUBSTR (v_procedure_name, 1,
22 INSTR (v_procedure_name, ' '));
23 END IF;
24 INSERT INTO audit_table
25 (table_name,
26 owner_name,
27 procedure_name)
28 VALUES
29 ('DEPT',
30 v_owner_name,
31 v_procedure_name);
32 END insert_dept_trig;
33 /
Trigger created.
SQL> CREATE OR REPLACE PROCEDURE insert_dept
2 AS
3 BEGIN
4 INSERT INTO dept (deptno)
5 VALUES (50);
6 END insert_dept;
7 /
Procedure created.
SQL> EXEC insert_dept
PL/SQL procedure successfully completed.
SQL> COLUMN table_name FORMAT A15 WORD_WRAPPED
SQL> COLUMN owner_name FORMAT A15 WORD_WRAPPED
SQL> COLUMN procedure_name FORMAT A15 WORD_WRAPPED
SQL> SELECT *
2 FROM audit_table
3 /
TABLE_NAME OWNER_NAME PROCEDURE_NAME
DEPT SCOTT INSERT_DEPT -
How to get block name in a tab canvas
I am trying to develope a form with six tabs on a tab canvas. Each tab pages contains a block derived from a database table and not items taken from the same table.
If I want to capture the name of the block in a tab page when page is changed, How can I do it.If you like CRAZY PAIN you can parse dbms_utility.format_call_stack to get the trigger name and owner and then using all/user_triggers extract info of table name, which has such trigger defined on it.
Although I wouldn't do that :)
I'd simply create a variable in trigger definition containing table_name and/or another variable containing trigger name and use them.
It is especially easy if you are generating triggers for example for some auditing purposes.
Gints Plivna
http://www.gplivna.eu -
Hello,
i would like to know if there is any possibility in PL/SQL to get the current stack depth inoformation. I am not sure if this is the right description, i would like to know how deep into calling subprograms has a program execution come at the moment.
I would like to use this information for automatical indentation of log file, produced by a pl/sql procedure call.948452 wrote:
Can you please provide me with some sample code?Unable to read the documentation for some reason?
SQL> ed
Wrote file afiedt.buf
1 create or replace procedure callme(x in number, y in number) is
2 v_call_stack varchar2(32767);
3 begin
4 v_call_stack := dbms_utility.format_call_stack();
5 dbms_output.put_line(v_call_stack);
6 if x < y then
7 callme(x+1,y);
8 end if;
9* end;
SQL> /
Procedure created.
SQL> exec callme(1,5);
----- PL/SQL Call Stack -----
object line object
handle number name
3F6E5040 4 procedure SCOTT.CALLME
482416A0 1 anonymous block
----- PL/SQL Call Stack -----
object line object
handle number name
3F6E5040 4 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
482416A0 1 anonymous block
----- PL/SQL Call Stack -----
object line object
handle number name
3F6E5040 4 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
482416A0 1 anonymous block
----- PL/SQL Call Stack -----
object line object
handle number name
3F6E5040 4 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
3F6E5040 7 procedure
SCOTT.CALLME
482416A0 1 anonymous block
----- PL/SQL Call Stack -----
object line object
handle number name
3F6E5040 4 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
3F6E5040 7 procedure SCOTT.CALLME
482416A0 1 anonymous block
PL/SQL procedure successfully completed. -
How to find package name of transactioncode
hai friends,
how i can find the package name for a given transaction code .
i think by using se93
Moderator message: please search for available information.
Edited by: Thomas Zloch on Jul 8, 2011 9:52 AMNot sure, if this is what you're looking for
SQL> create or replace procedure p0 as
2 begin
3 dbms_output.put_line(dbms_utility.format_call_stack);
4 end;
5 /
Procedure created.
SQL> create or replace procedure p1 as
2 begin
3 p0;
4 end;
5 /
Procedure created.
SQL> create or replace procedure p2 as
2 begin
3 p1;
4 end;
5 /
Procedure created.
SQL> set serveroutput on
SQL> begin
2 p2;
3 end;
4 /
----- PL/SQL Call Stack -----
object line object
handle number name
3a7f2d618 3 procedure INV_ADM.P0
39abfeef0 3 procedure INV_ADM.P1
39c5ae7a0 3 procedure INV_ADM.P2
3a0f3a538 2 anonymous block
PL/SQL procedure successfully completed.
SQL> -
How to send e-mail with an attachment from remote database server.???
Hi All,
I have tried the simple mail sending and with the attachment using UTL_SMTP. But the problem is , it is sending the mail with attachment of the file name i give, it takes and creates that file and sends as attachment not from the actual file location. I am trying to attach the file which i stored in remote database server.
The following code I tried. But not worked for attachment
DECLARE
v_From VARCHAR2(80) := '[email protected]';
v_Recipient VARCHAR2(80) := '[email protected]';
v_Subject VARCHAR2(80) := 'test subject';
v_Mail_Host VARCHAR2(30) := 'pop3.somedomain.com';
v_Mail_Conn utl_smtp.Connection;
crlf VARCHAR2(2) := chr(13)||chr(10);
BEGIN
v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);
utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);
utl_smtp.Mail(v_Mail_Conn, v_From);
utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);
utl_smtp.Data(v_Mail_Conn,
'Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||
'From: ' || v_From || crlf ||
'Subject: '|| v_Subject || crlf ||
'To: ' || v_Recipient || crlf ||
'MIME-Version: 1.0'|| crlf || -- Use MIME mail standard
'Content-Type: multipart/mixed;'|| crlf ||
' boundary="-----SECBOUND"'|| crlf ||
crlf ||
'-------SECBOUND'|| crlf ||
'Content-Type: text/html;'|| crlf ||
'Content-Transfer_Encoding: 7bit'|| crlf ||
crlf ||
'some message text'|| crlf || -- Message body
'more message text'|| crlf ||
crlf ||
'-------SECBOUND'|| crlf ||
'Content-Type: text/html;'|| crlf ||
' name="Fund Authorization report"'|| crlf ||
'Content-Transfer_Encoding: 8bit'|| crlf ||
'Content-Disposition: attachment;'|| crlf ||
' filename="/usr/tmp/Test.html"'|| crlf ||
crlf ||
'HTML Attachment'|| crlf || -- Content of attachment
crlf ||
'-------SECBOUND--' -- End MIME mail
utl_smtp.Quit(v_mail_conn);
EXCEPTION
WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then
raise_application_error(-20000, 'Unable to send mail: '||sqlerrm);
END;How can I attach a file which is stored in database server and send it in a mail.
Please someone help me in this.
Thanks,
Alaka.Try this code
Regards Salim.
CREATE OR REPLACE TRIGGER EmailOnServerErr AFTER SERVERERROR ON DATABASE
DECLARE
mail_conn UTL_SMTP.connection;
crlf VARCHAR2(2) := chr(13)||chr(10);
msg VARCHAR2(32760);
sid_name VARCHAR2(16);
bdump_dest VARCHAR2(128);
smtp_relay VARCHAR2(32) := 'MyMailRelay';
recipient_address VARCHAR2(64) := '[email protected]';
sender_address VARCHAR2(64) := '[email protected]';
mail_port NUMBER := 25;
log_file_handle UTL_FILE.FILE_TYPE;
log_file_dir VARCHAR2(256) := 'ERR_LOG_DIR';
log_file_name VARCHAR2(256) := 'OracleErrors.log';
maxlinesize NUMBER := 32767;
session_rec sys.v_$session%ROWTYPE;
audit_rec sys.dba_audit_trail%ROWTYPE;
auditing BOOLEAN;
LinesOfSQL BINARY_INTEGER;
offending_sql DBMS_STANDARD.ora_name_list_t;
CURSOR bdump_cur IS
SELECT TRIM(value)
FROM v$parameter
WHERE name = 'background_dump_dest'
CURSOR sid_cur IS
SELECT TRIM(instance_name)
FROM v$instance
CURSOR session_cur IS
SELECT s.*
FROM v$session s
WHERE s.sid = dbms_support.mysid
CURSOR audit_trail_cur(AUDSID IN NUMBER) IS
SELECT *
FROM dba_audit_trail
WHERE sessionid = AUDSID
BEGIN
IF (USER = 'SYSTEM' OR USER = 'SYS') THEN
-- Ignore this error
NULL;
ELSIF IS_SERVERERROR (1034) THEN
-- Ignore this error
NULL;
ELSE
-- get the sid
OPEN sid_cur;
FETCH sid_cur INTO sid_name;
CLOSE sid_cur;
-- get the location of the alert log
OPEN bdump_cur;
FETCH bdump_cur INTO bdump_dest;
CLOSE bdump_cur;
-- get the session information
OPEN session_cur;
FETCH session_cur INTO session_rec;
CLOSE session_cur;
-- get the audit_trail information if it exists
OPEN audit_trail_cur(session_rec.audsid);
FETCH audit_trail_cur INTO audit_rec;
auditing := audit_trail_cur%FOUND;
CLOSE audit_trail_cur;
IF session_rec.program = 'MyProgram.exe' THEN
NULL; -- ignore actions from MyProgram - that's where I do maintenance
ELSE
-- compose the message
msg := 'Subject: Oracle error '||' on '||sid_name||crlf;
msg := msg||'To: '||recipient_address||crlf;
msg := msg||'For more information see the alert log file located at:'||crlf;
msg := msg||bdump_dest||'/alert_'||sid_name||'.log'||crlf;
msg := msg||'or the error log file: $'||log_file_dir||'/'||log_file_name||crlf;
msg := msg||'Error Time='||TO_CHAR(SYSDATE,'DD-Mon-YYYY HH24:MI:SS')||crlf;
msg := msg||DBMS_UTILITY.FORMAT_CALL_STACK||crlf;
LinesOfSQL := sql_txt(offending_sql);
msg := msg||'Offending SQL is:'||crlf;
FOR loop_counter IN offending_sql.FIRST..offending_sql.LAST
LOOP
msg := msg||offending_sql(loop_counter);
END LOOP;
msg := msg||crlf||'----- PL/SQL Error Stack -----'||crlf;
msg := msg||DBMS_UTILITY.FORMAT_ERROR_STACK||crlf;
msg := msg||'V$SESSION.SADDR=' ||session_rec.saddr ||crlf;
msg := msg||'V$SESSION.SID=' ||session_rec.sid ||crlf;
msg := msg||'V$SESSION.SERIAL#=' ||session_rec.serial# ||crlf;
msg := msg||'V$SESSION.AUDSID=' ||session_rec.audsid ||crlf;
msg := msg||'V$SESSION.PADDR=' ||session_rec.paddr ||crlf;
msg := msg||'V$SESSION.USER#=' ||session_rec.user# ||crlf;
msg := msg||'V$SESSION.USERNAME='||session_rec.username||crlf;
msg := msg||'V$SESSION.COMMAND=' ||session_rec.command ||crlf;
msg := msg||'V$SESSION.OWNERID=' ||session_rec.ownerid ||crlf;
msg := msg||'V$SESSION.TADDR=' ||NVL(session_rec.taddr ,'Null')||crlf;
msg := msg||'V$SESSION.LOCKWAIT='||NVL(session_rec.lockwait,'Null')||crlf;
msg := msg||'V$SESSION.STATUS=' ||NVL(session_rec.status ,'Null')||crlf;
msg := msg||'V$SESSION.SERVER=' ||NVL(session_rec.server ,'Null')||crlf;
msg := msg||'V$SESSION.SCHEMA#=' ||session_rec.schema#||crlf;
msg := msg||'V$SESSION.SCHEMANAME=' ||NVL(session_rec.schemaname,'Null')||crlf;
msg := msg||'V$SESSION.OSUSER=' ||NVL(session_rec.osuser ,'Null')||crlf;
msg := msg||'V$SESSION.PROCESS=' ||NVL(session_rec.process ,'Null')||crlf;
msg := msg||'V$SESSION.MACHINE=' ||NVL(session_rec.machine ,'Null')||crlf;
msg := msg||'V$SESSION.TERMINAL=' ||NVL(session_rec.terminal ,'Null')||crlf;
msg := msg||'V$SESSION.PROGRAM=' ||NVL(session_rec.program ,'Null')||crlf;
msg := msg||'V$SESSION.TYPE=' ||NVL(session_rec.type ,'Null')||crlf;
msg := msg||'V$SESSION.SQL_ADDRESS=' ||session_rec.sql_address ||crlf;
msg := msg||'V$SESSION.SQL_HASH_VALUE=' ||NVL(TO_CHAR(session_rec.sql_hash_value) ,'Null')||crlf;
msg := msg||'V$SESSION.PREV_SQL_ADDR=' ||session_rec.prev_sql_addr||crlf;
msg := msg||'V$SESSION.PREV_HASH_VALUE='||NVL(TO_CHAR(session_rec.prev_hash_value),'Null')||crlf;
msg := msg||'V$SESSION.MODULE=' ||NVL(session_rec.module ,'Null')||crlf;
msg := msg||'V$SESSION.MODULE_HASH='||NVL(TO_CHAR(session_rec.module_hash),'Null')||crlf;
msg := msg||'V$SESSION.ACTION=' ||NVL(session_rec.action ,'Null')||crlf;
msg := msg||'V$SESSION.ACTION_HASH='||NVL(TO_CHAR(session_rec.action_hash),'Null')||crlf;
msg := msg||'V$SESSION.CLIENT_INFO='||NVL(session_rec.client_info ,'Null')||crlf;
msg := msg||'V$SESSION.FIXED_TABLE_SEQUENCE='||NVL(TO_CHAR(session_rec.fixed_table_sequence),'Null')||crlf;
msg := msg||'V$SESSION.ROW_WAIT_OBJ#=' ||NVL(TO_CHAR(session_rec.row_wait_obj#) ,'Null')||crlf;
msg := msg||'V$SESSION.ROW_WAIT_FILE#=' ||NVL(TO_CHAR(session_rec.row_wait_file#) ,'Null')||crlf;
msg := msg||'V$SESSION.ROW_WAIT_BLOCK#='||NVL(TO_CHAR(session_rec.row_wait_block#),'Null')||crlf;
msg := msg||'V$SESSION.ROW_WAIT_ROW#=' ||NVL(TO_CHAR(session_rec.row_wait_row#) ,'Null')||crlf;
msg := msg||'V$SESSION.LOGON_TIME=' ||NVL(TO_CHAR(session_rec.logon_time,'DD-Mon-YYYY HH24:MI:SS'),'Null')||crlf;
msg := msg||'V$SESSION.LAST_CALL_ET=' ||NVL(TO_CHAR(session_rec.last_call_et) ,'Null')||crlf;
msg := msg||'V$SESSION.PDML_ENABLED=' ||NVL(session_rec.pdml_enabled ,'Null')||crlf;
msg := msg||'V$SESSION.FAILOVER_TYPE=' ||NVL(session_rec.failover_type ,'Null')||crlf;
msg := msg||'V$SESSION.FAILOVER_METHOD='||NVL(session_rec.failover_method,'Null')||crlf;
msg := msg||'V$SESSION.FAILED_OVER=' ||NVL(session_rec.failed_over ,'Null')||crlf;
msg := msg||'V$SESSION.RESOURCE_CONSUMER_GROUP='||NVL(session_rec.resource_consumer_group,'Null')||crlf;
msg := msg||'V$SESSION.PDML_STATUS=' ||NVL(session_rec.pdml_status ,'Null')||crlf;
msg := msg||'V$SESSION.PDDL_STATUS=' ||NVL(session_rec.pddl_status ,'Null')||crlf;
msg := msg||'V$SESSION.PQ_STATUS=' ||NVL(session_rec.pq_status ,'Null')||crlf;
IF auditing THEN
msg := msg||'DBA_AUDIT_TRAIL.OS_USERNAME=' ||NVL(audit_rec.os_username,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.USERNAME=' ||NVL(audit_rec.username ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.USERHOST=' ||NVL(audit_rec.userhost ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.TERMINAL=' ||NVL(audit_rec.terminal ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.TIMESTAMP=' ||TO_CHAR(audit_rec.timestamp,'DD-Mon-YYYY HH24:MI:SS')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.OWNER=' ||NVL(audit_rec.owner ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.OBJ_NAME=' ||NVL(audit_rec.obj_name ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.ACTION=' ||audit_rec.action ||crlf;
msg := msg||'DBA_AUDIT_TRAIL.ACTION_NAME=' ||NVL(audit_rec.action_name ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.NEW_OWNER=' ||NVL(audit_rec.new_owner ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.NEW_NAME=' ||NVL(audit_rec.new_name ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.OBJ_PRIVILEGE='||NVL(audit_rec.obj_privilege ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.SYS_PRIVILEGE='||NVL(audit_rec.sys_privilege ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.ADMIN_OPTION=' ||NVL(audit_rec.admin_option ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.GRANTEE=' ||NVL(audit_rec.grantee ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.AUDIT_OPTION=' ||NVL(audit_rec.audit_option ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.SES_ACTIONS=' ||NVL(audit_rec.ses_actions ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.LOGOFF_TIME=' ||NVL(TO_CHAR(audit_rec.logoff_time) ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.LOGOFF_LREAD=' ||NVL(TO_CHAR(audit_rec.logoff_lread) ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.LOGOFF_PREAD=' ||NVL(TO_CHAR(audit_rec.logoff_pread) ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.LOGOFF_LWRITE='||NVL(TO_CHAR(audit_rec.logoff_lwrite),'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.LOGOFF_DLOCK=' ||NVL(audit_rec.logoff_dlock ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.COMMENT_TEXT=' ||NVL(audit_rec.comment_text ,'Null')||crlf;
msg := msg||'DBA_AUDIT_TRAIL.SESSIONID=' ||audit_rec.sessionid ||crlf;
msg := msg||'DBA_AUDIT_TRAIL.ENTRYID=' ||audit_rec.entryid ||crlf;
msg := msg||'DBA_AUDIT_TRAIL.STATEMENTID=' ||audit_rec.statementid ||crlf;
msg := msg||'DBA_AUDIT_TRAIL.RETURNCODE=' ||audit_rec.returncode ||crlf;
msg := msg||'DBA_AUDIT_TRAIL.PRIV_USED=' ||NVL(audit_rec.priv_used,'Null')||crlf;
END IF;
msg := msg||'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-'||crlf||crlf;
-- write the message to the error log file
log_file_handle := UTL_FILE.FOPEN (log_file_dir, log_file_name, 'A',maxlinesize);
UTL_FILE.PUT_LINE(log_file_handle,msg);
UTL_FILE.FCLOSE(log_file_handle);
-- send the message by Email
mail_conn := UTL_SMTP.open_connection(smtp_relay, mail_port);
UTL_SMTP.HELO(mail_conn, smtp_relay);
UTL_SMTP.MAIL(mail_conn, sender_address);
UTL_SMTP.RCPT(mail_conn, recipient_address);
UTL_SMTP.DATA(mail_conn, msg);
UTL_SMTP.QUIT(mail_conn);
END IF; -- client_program = MyProgram.exe
END IF;
END;
/
Maybe you are looking for
-
How to remove the default Digital ID in my mac Adobe Acrobat Pro 8.3.1?
Dear All, I have my mac Adobe Acrobat Professional 8.3.1, I never used it to sign a document, and last week, after I opened up a document created from my lab's PC computer with Window 9 version of Acrobat Pro, the Digital ID with someone's name someh
-
My calendar and notes sync via iCloud from my iPhone to my desktop but not visa versa. How can I fix that?
-
What happens to my purchased Apps, in case, I change country of my Apple ID.
While purchasing Apps from Store a message shows up " Not available in Emirati Store. Change to US Store for Purchase".Can I make purchase by changing country without impacting the earlier purchased Apps?
-
DBMS_FILE_TRANSFER.COPY_FILE
10.2.4.4. on RH Hi, Plan to copy files from ASM to the file system using DBMS_FILE_TRANSFER.COPY_FILE. Connected to the ASM instance: SQL> create directory DGROUP as '/home/oracle/backups/DBA'; create directory DGROUP as '/home/oracle/backups/DBA' ER
-
I can`t open PDF in Safari
I can't open PDF's in a browser window. It's like the plug-in is not there. I have Acrobat 9 pro. I've been using Safari. Help me.