|
Программирование >> Oracle
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);
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |