как получить предыдущие команды SQL - PullRequest
2 голосов
/ 04 марта 2011

хотел бы спросить, как получить все мои прошлые запросы к базе данных sql в течение этого сеанса? спасибо

Ответы [ 2 ]

6 голосов
/ 04 марта 2011

Я почти уверен, что Oracle не хранит данные по всем прошлым запросам (закрытые курсоры) для каждой сессии. Однако я могу придумать несколько способов получить эти данные:

  • Если вы используете PL / SQL, большинство ваших прошлых курсоров останутся в вашем кеше сеанса (до параметра инициализации cursor_sharing). Вы можете запросить представление v$open_cursor:

    SELECT * FROM v$open_cursor WHERE sid=to_number(sys_context('USERENV','SID'))
    

    Присоединитесь к этому представлению к v$sqltext (или v$sqltext_with_newlines), чтобы получить полный текст sql:

     SELECT o.saddr, s.address, o.hash_value, s.piece, s.sql_text
       FROM v$open_cursor o
       JOIN v$sqltext_with_newlines s ON o.address = s.address
                                     AND o.hash_value = s.hash_value
      WHERE sid = to_number(sys_context('USERENV', 'SID'))
      ORDER BY o.saddr,  s.address, o.hash_value, s.piece;
    
  • Вы можете проследить ваш сеанс, открыв получившийся файл трассировки после завершения сеанса, откроет весь SQL (более того, вы можете tkprof файла трассировки, чтобы получить сводку и статистику).

2 голосов
/ 04 марта 2011

Как указал Винсент, единственным способом (афаик) было бы проследить сеанс на уровне клиента.

В дополнение к открытым курсорам (как это делает Жаба), другой, менее точный,можно было бы использовать ASH (Active Session History).

Проблемы с ASH заключаются в том, что

  1. он выбирает каждую секунду для активных сессий (поэтому вы пропускаете все быстрые),
  2. это циклический буфер (резервное копирование представлением DBA_HIST_ACTIVE_SESS_HISTORY), чтобы вы пропустили старые.

Это потому, что он предназначен только для "улавливания" долго выполняющихся запросов с целью повышения производительности.
Однако он хорошо адаптирован, если интересуются только запросы с большим временем ответа.

Для этого стоит простой запрос, возвращающий историю длинных запросов сеанса.

select 
  sqla.sql_text
from 
  v$active_session_history hist,
  v$sqlarea sqla,
  v$session ss 
 where 
   sqla.sql_id = hist.sql_id and
   ss.sid = hist.session_id and
   ss.serial# = hist.session_serial# and
   ss.audsid = sys_context('USERENV', 'SESSIONID') ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...