web-dev-qa-db-fra.com

Comment montrez-vous l'exécution SQL sur une base de données Oracle?

Comment pouvez-vous montrer le SQL qui s'exécute actuellement sur une base de données Oracle?

Des informations supplémentaires qui pourraient être utiles incluent l'utilisateur, l'identifiant de session, etc.

27
Clarkey

La plupart des informations sont disponibles dans v $ session ... et le texte SQL peut être récupéré à partir de v $ sql ou v $ sqltext_with_newlines ...

Voici une requête que j'utilise souvent qui formate SQL en vol, la plus longue en haut.

-- In Flight SQL 
SELECT nvl(ses.username,'Oracle PROC')||' ('||ses.sid||')' USERNAME,
       SID,   
       MACHINE, 
       REPLACE(SQL.SQL_TEXT,CHR(10),'') STMT, 
      ltrim(to_char(floor(SES.LAST_CALL_ET/3600), '09')) || ':'
       || ltrim(to_char(floor(mod(SES.LAST_CALL_ET, 3600)/60), '09')) || ':'
       || ltrim(to_char(mod(SES.LAST_CALL_ET, 60), '09'))    RUNT 
  FROM V$SESSION SES,   
       V$SQLtext_with_newlines SQL 
 where SES.STATUS = 'ACTIVE'
   and SES.USERNAME is not null
   and SES.SQL_ADDRESS    = SQL.ADDRESS 
   and SES.SQL_HASH_VALUE = SQL.HASH_VALUE 
   and Ses.AUDSID <> userenv('SESSIONID') 
 order by runt desc, 1,sql.piece;
35
David Mann

Bonne réponse trouvée ici .

Exécutez le sql suivant:

select x.sid
      ,x.serial#
      ,x.username
      ,x.sql_id
      ,x.sql_child_number
      ,optimizer_mode
      ,hash_value
      ,address
      ,sql_text
from   v$sqlarea sqlarea
      ,v$session x
where  x.sql_hash_value = sqlarea.hash_value
and    x.sql_address    = sqlarea.address
and    x.username       is not null;

Si la sortie est illisible, changez le LINESIZE (prenez de ici ):

SET LINESIZE 20000

Si le SQL ci-dessus ne fonctionne pas, vous devrez peut-être vous connecter en tant que sysdba:

sqlplus '/as sysdba'
9
Clarkey