Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как получить имя вызвавшей процедуры? / 7 сообщений из 7, страница 1 из 1
09.01.2003, 11:00
    #32087934
Мурзик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить имя вызвавшей процедуры?
Уважаемые Дамы и господа!
Помогите в разрешении следующей проблемы-

Имеем 3 процедурочки пр1 ,пр2 и пр3.
пр1 вызывается из пр2 и из пр3.
Как можно в процедуре пр2 определить имя вызвавшей процедуры?

То есть был ли этот вызов из пр2 или из пр3?

Заранее всем большое спасибо.
...
Рейтинг: 0 / 0
09.01.2003, 11:40
    #32087983
Allexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить имя вызвавшей процедуры?
Передавай параметром
...
Рейтинг: 0 / 0
10.01.2003, 04:46
    #32088548
Rudyshin Sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить имя вызвавшей процедуры?
Я пробовал воспользоваться следующей процедурой но у меня ничего не вышло. И еще кстати Oracle позволяет сохранить дерево вызовов процедур...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
owa_util.who_called_me procedure
Syntax
owa_util.who_called_me(
owner out varchar2
name out varchar2
lineno out number
caller_t out varchar2);
Purpose
This procedure returns information (in the form of output parameters) about the
PL/SQL code unit that invoked it.
Parameters
owner - the owner of the program unit.
name - the name of the program unit. This is the name of the package, if the calling
program unit is wrapped in a package, and the name of the procedure or function
if the calling program unit is a stand-alone procedure or function. If the calling program
unit is part of an anonymous block, this is NULL.
lineno - the line number within the program unit where the call was made.
caller_t - the type of program unit that made the call. The possibilities are: package
body, anonymous block. procedure, and function. Procedure and function are used
only for stand-alone procedures and functions.
Generates
Not applicable.
...
Рейтинг: 0 / 0
10.01.2003, 09:04
    #32088576
Allexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить имя вызвавшей процедуры?
Отлично работает

create or replace procedure test1 is
begin
test2;
end test1;

create or replace procedure test2 is
a varchar2(100);
b varchar2(100);
c number;
d varchar2(100);
begin
owa_util.who_called_me(a,b,c,d);
dbms_output.put_line(a||' '||b||' '||c||' '||d);
end test2;

begin
test1;
end;

Output:
UCHZATR TEST1 3 PROCEDURE
...
Рейтинг: 0 / 0
10.01.2003, 09:57
    #32088615
Rudyshin Sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить имя вызвавшей процедуры?
А у меня вот такая ошибка вылазит.

Код: plaintext
1.
2.
3.
4.
ORA- 06502 : PL/SQL: : ошибка преобразования символа в число ошибка числа или значения
ORA- 06512 : на   "SYS.OWA_UTIL" , line  1596 
ORA- 06512 : на   "DV_MP.TEST2" , line  7 
ORA- 06512 : на   "DV_MP.TEST1" , line  3 
ORA- 06512 : на  line  2 


Интересно почему?
...
Рейтинг: 0 / 0
10.01.2003, 10:33
    #32088647
Allexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить имя вызвавшей процедуры?
Что за оракл?
...
Рейтинг: 0 / 0
10.01.2003, 13:12
    #32088771
Allexx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить имя вызвавшей процедуры?
Попробуй создать процедурку и потестить её.

create or replace procedure
who_called_new( owner out varchar2,
name out varchar2,
lineno out number,
caller_t out varchar2 )
as
call_stack varchar2(4096) default dbms_utility.format_call_stack;
n number;
found_stack BOOLEAN default FALSE;
line varchar2(255);
t varchar2(255);
cnt number := 0;
begin
--
loop
n := instr( call_stack, chr(10) );
exit when ( cnt = 3 or n is NULL or n = 0 );
--
line := substr( call_stack, 1, n-1 );
call_stack := substr( call_stack, n+1 );
--
if ( NOT found_stack ) then
if ( line like '%handle%number%name%' ) then
found_stack := TRUE;
end if;
else
cnt := cnt + 1;
-- cnt = 1 is ME
-- cnt = 2 is MY Caller
-- cnt = 3 is Their Caller
if ( cnt = 3 ) then
-- Fix 718865
--lineno := to_number(substr( line, 13, 6 ));
--line := substr( line, 21 );
n := instr(line, ' ');
if (n > 0)
then
t := ltrim(substr(line, n));
n := instr(t, ' ');
end if;
if (n > 0)
then
lineno := to_number(substr(t, 1, n - 1));
line := ltrim(substr(t, n));
else
lineno := 0;
end if;
if ( line like 'pr%' ) then
n := length( 'procedure ' );
elsif ( line like 'fun%' ) then
n := length( 'function ' );
elsif ( line like 'package body%' ) then
n := length( 'package body ' );
elsif ( line like 'pack%' ) then
n := length( 'package ' );
else
n := length( 'anonymous block ' );
end if;
caller_t := ltrim(rtrim(upper(substr( line, 1, n-1 ))));
line := substr( line, n );
n := instr( line, '.' );
owner := ltrim(rtrim(substr( line, 1, n-1 )));
name := ltrim(rtrim(substr( line, n+1 )));
end if;
end if;
end loop;
end who_called_new;
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как получить имя вызвавшей процедуры? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]