Программирование >>  Oracle 

1 ... 432 433 434 [ 435 ] 436 437 438 ... 469


1728

Приложение А

line cnt begin

loop

11 12

14 15

16 17 18

21 22

24 25 26

28 29

-> подпрограмму,

varchar2(255); number := 0;

:= 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);

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

-> n-1))));

49 50 51 52 53 54 55 56 57 58 59

(NOT found stack) then

if (line like %handle%number%name%) then

found stack := TRUE; end if;

else

cnt := cnt + 1;

- cnt = 1 - это я

- cnt = 2 - это подпрограа, которая меня вызвала

- cnt = 3 - это подограмма, которая вызвала вызвавшую меня

if (cnt = 3) then

lineno := to number(substr(line, 13, 6)); line := substr(line, 2 1); 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 ) ; elsif (line like anonymous block%) then n := length(anonymous block ) ; else - must be a trigger n := 0;

end if;

if (n <> 0)

caller t

then

:= ltrim(rtrim(upper(substr(line,l,

owner name end if;

end if;

end loop;

return owner .

line := substr(line, n) ;

else

caller t := TRIGGER;

line := ltrim(line); end if;

n := instr(line, .) ;

:= ltrim(rtrim(substr(line, := ltrim(rtrim(substr(line.

1, n-1))); n+1)));

name;



Пакет DBMS UTILITY 1729

61 end;

62 /

Function created.

tkyte@TKYTE816> create or replace function who am i return varchar2

2 as

3 begin

4 return my caller;

5 end;

Functioncreated.

При наличии этих процедур можно реализовать интересные решения. В частности, они могут использоваться в следующих случаях.

Для проверки. Процедуры проверки могут регистрировать не только пользователя, выполнившего определенное действие, но и код, выполнивший это действие.

Для отладки. Например, если снабдить код вызовами DBMS APPLICATION INFO.SET CLIENT INFO(WHO AM I), в другом сеансе можно выполнить запросы к представлению V$SESSION, чтобы определить, какой фрагмент кода сейчас выполняется. Подробнее о пакете DBMS APPLICATION INFO см. в начале приложения А.

Функция G TIME

Эта функция возвращает время, прошедшее с определенного момента, с точностью до сот1х долей секунды. Функция GET TIME не возвращает значение текущего времени, как можно было предположить по ее названию. Ее можно использовать для измерения периода времени между событиями. Обычно эта функция используется следующим образом:

scott@TKYTE816> declare

2 l start number;

3 n number := 0;

4 begin 5

6 l start := dbms utility.get time;

8 for x in 1 .. 100000

9 loop

10 n := n+1;

11 end loop;

13 dbms output.put line( it took

14 round((dbms utility.get time-l start)/100, 2)

15 seconds...);

16 end;

17 /

it took .12 seconds.. .

PL/SQL procedure successfully completed.



1730 Приложение

Итак, функция GET TIME используется для измерения времени с точностью до сот1х долей секунды. Нужно, однако, учитывать, что счетчик GET TIME может переполниться, сбросится в ноль и начать отсчет сначала, если сервер работает достаточно долго. Сейчас на большинстве платформ сброс произойдет не раньше, чем через год. Для счетчика используется 32-битовое целое число, что позволяет хранить сотые доли секунды примерно для 497 дней. После этого произойдет переполнение счетчика, и отсчет начнется с нуля. На некоторых платформах операционная система увеличивает значение счетчика чаще, чем раз в одну сотую секунды. На этих платформах сброс счетчика может произойти раньше, чем через 497 дней. Например, на платформе Sequent таймер обнуляется за 71,58 минуты, поскольку в этой операционной системе счетчик отсчитывает микросекунды, поэтому 32-битовое целое переполняется существенно быстрее. На 64-битовых платформах счетчик не переполнится и за тысячи лет.

Последнее замечание о функции GET TIME. Значение, возвращаемое функцией GET TIME, может быть получено и с помощью оператора SELECT * FROM V$TIMER. Это динамическое представление и функция GET TIME возвращают одно и то же:

tkyte@TKYTE816>selecthsecs, dbms utility.get time 2 from v$timer;

HSECS GET TIME

7944822 7944822

Функция GET PARAMETER VALUE

Эта функция позволяет пользователю получить значение указанного параметра конфигурации. Даже при отсутствии доступа к представлению V$PARAMETER и невозможности выполнить команду SHOW PARAMETER, c помощью этой функции можно получить значение параметра инициализации сервера. Функция используется следующим образом:

scott@TKYTE816> show parameter utl file dir ORA-00942: table or view does not exist

scott@TKYTE816> select * from v$parameter where name = utl file dir

select * from v$parameter where name = utl file dir *

ERROR at line 1:

ORA-00942 : table or view does not exist

scott@TKYTE816> declare

2 intval number;

3 strval varchar2(512) ;

4 begin

5 if (dbms utility.get parameter value(utl file dir,

6 intval,

7 strval) = 0)

8 then

9 dbms output.put line(Значение= intval);



1 ... 432 433 434 [ 435 ] 436 437 438 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика