【问题标题】:sqlplus how to find details of the currently connected database sessionsqlplus 如何查找当前连接的数据库会话的详细信息
【发布时间】:2013-03-10 15:15:57
【问题描述】:

我最近开始研究 oracle 数据库。通常我有许多 sqlplus 窗口打开到不同的 oracle 数据库。从一个 sqlplus 会话切换到另一个时,如何查看每个 sqlplus 会话的当前会话详细信息?非常感谢任何帮助!

【问题讨论】:

  • 使用 sys_context 函数link 找到它,例如:select sys_context('USERENV','db_name') from dual;或者更简单地从 v$ 视图...从 v$database 中选择名称;我认为 v$views 通常仅限于 DBA,因此 sys_context 将是最佳选择。
  • 如果这是你想要的,那么你可以这样做select * from global_name

标签: oracle sqlplus


【解决方案1】:

我们可以从下面的查询中得到session的详细信息和状态:

select ' Sid, Serial#, Aud sid : '|| s.sid||' , '||s.serial#||' , '||
       s.audsid||chr(10)|| '     DB User / OS User : '||s.username||
       '   /   '||s.osuser||chr(10)|| '    Machine - Terminal : '||
       s.machine||'  -  '|| s.terminal||chr(10)||
       '        OS Process Ids : '||
       s.process||' (Client)  '||p.spid||' (Server)'|| chr(10)||
       '   Client Program Name : '||s.program "Session Info"
  from v$process p,v$session s
 where p.addr = s.paddr
   and s.sid = nvl('&SID',s.sid)
   and nvl(s.terminal,' ') = nvl('&Terminal',nvl(s.terminal,' '))
   and s.process = nvl('&Process',s.process)
   and p.spid = nvl('&spid',p.spid)
   and s.username = nvl('&username',s.username)
   and nvl(s.osuser,' ') = nvl('&OSUser',nvl(s.osuser,' '))
   and nvl(s.machine,' ') = nvl('&machine',nvl(s.machine,' '))
   and nvl('&SID',nvl('&TERMINAL',nvl('&PROCESS',nvl('&SPID',nvl('&USERNAME',
       nvl('&OSUSER',nvl('&MACHINE','NO VALUES'))))))) <> 'NO VALUES'
/

更多详情: https://ora-data.blogspot.in/2016/11/query-session-details.html

谢谢,

【讨论】:

    【解决方案2】:
    select sys_context('USERENV','INSTANCE_NAME') from dual;
    

    &

    select instance_name from v$instance;
    

    会给你实例名称。 也可以使用select * from global_name;查看实例的全局名称。

    【讨论】:

    • SHOW PARAMETER 方法需要对v$instance 的查询访问权限,但这种SYS_CONTEXT 方法不需要。 (+)
    【解决方案3】:

    我知道这是一个老问题,但我确实尝试了上述所有答案,但在我的情况下没有用。最终帮助我的是

    SHOW PARAMETER instance_name

    【讨论】:

      【解决方案4】:

      看看这个(c) Tanel Poder。您可以从您的 glogin.sql 运行它(因此这些设置将在您每次连接时更新,或者只是手动运行它。注意host title 命令 - 它使用会话信息更改您的 sql*plus 控制台窗口标题 - 对于许多人来说非常有用窗户同时打开。

      -- the Who am I script
      
      def   mysid="NA"
      def _i_spid="NA"
      def _i_cpid="NA"
      def _i_opid="NA"
      def _i_serial="NA"
      def _i_inst="NA"
      def _i_host="NA"
      def _i_user="&_user"
      def _i_conn="&_connect_identifier"
      
      col i_username head USERNAME for a20
      col i_sid head SID for a5 new_value mysid
      col i_serial head SERIAL# for a8 new_value _i_serial
      col i_cpid head CPID for a15 new_value _i_cpid
      col i_spid head SPID for a15 new_value _i_spid
      col i_opid head OPID for a5 new_value _i_opid
      col i_host_name head HOST_NAME for a25 new_value _i_host
      col i_instance_name head INST_NAME for a12 new_value _i_inst
      col i_ver head VERSION for a10
      col i_startup_day head STARTED for a8
      col _i_user noprint new_value _i_user
      col _i_conn noprint new_value _i_conn
      col i_myoraver noprint new_value myoraver
      
      select 
          s.username          i_username, 
          i.instance_name i_instance_name, 
          i.host_name         i_host_name, 
          to_char(s.sid)          i_sid, 
          to_char(s.serial#)      i_serial, 
          (select substr(banner, instr(banner, 'Release ')+8,10) from v$version where rownum = 1) i_ver,
          (select  substr(substr(banner, instr(banner, 'Release ')+8),
                  1,
                  instr(substr(banner, instr(banner, 'Release ')+8),'.')-1)
           from v$version 
           where rownum = 1) i_myoraver,
          to_char(startup_time, 'YYYYMMDD') i_startup_day, 
          p.spid              i_spid, 
          trim(to_char(p.pid))        i_opid, 
          s.process           i_cpid, 
          s.saddr             saddr, 
          p.addr              paddr,
          lower(s.username) "_i_user",
          upper('&_connect_identifier') "_i_conn"
      from 
          v$session s, 
          v$instance i, 
          v$process p
      where 
          s.paddr = p.addr
      and 
          sid = (select sid from v$mystat where rownum = 1);
      
      -- Windows CMD.exe specific stuff
      
      -- host title %CP% &_i_user@&_i_conn [sid=&mysid ser#=&_i_serial spid=&_i_spid inst=&_i_inst host=&_i_host cpid=&_i_cpid opid=&_i_opid]
         host title %CP% &_i_user@&_i_conn [sid=&mysid #=&_i_serial]
      -- host doskey /exename=sqlplus.exe desc=set lines 80 sqlprompt ""$Tdescribe $*$Tset lines 299 sqlprompt "SQL> "
      
      -- short xterm title
      -- host echo -ne "\033]0;&_i_user@&_i_inst &mysid[&_i_spid]\007"
      -- long xterm title
      --host echo -ne "\033]0;host=&_i_host inst=&_i_inst sid=&mysid ser#=&_i_serial spid=&_i_spid cpid=&_i_cpid opid=&_i_opid\007"
      
      
      def myopid=&_i_opid
      def myspid=&_i_spid
      def mycpid=&_i_cpid
      
      -- undef _i_spid _i_inst _i_host _i_user _i_conn _i_cpid
      

      样本输出:

      17:39:35 SYSTEM@saz-dev> @sandbox
      Connected.
      18:29:02 SYSTEM@sandbox> @me
      
      USERNAME             INST_NAME    HOST_NAME                 SID   SERIAL#  VERSION    STARTED  SPID            OPID  CPID            SADDR    PADDR
      -------------------- ------------ ------------------------- ----- -------- ---------- -------- --------------- ----- --------------- -------- --------
      SYSTEM               xe           OARS-SANDBOX              34    175      11.2.0.2.0 20130318 3348            30    6108:7776       6F549590 6FF51020
      
      1 row selected.
      
      Elapsed: 00:00:00.04
      

      【讨论】:

      • 谢谢,它通过更改窗口标题做得很好。现在我可以简单地从 windows 任务栏中选择正确的 sqlplus 窗口。
      【解决方案5】:

      试试:

      select * from v$session where sid = SYS_CONTEXT('USERENV','SID');
      

      您可能还对this AskTom post感兴趣

      看到你的评论后,你可以这样做:

      SELECT * FROM global_name;
      

      【讨论】:

      • 感谢 cade,但我认为最好的回应来自“现在就在这里”,请参阅我的评论。再次感谢!
      【解决方案6】:
      show user
      

      获取连接用户

       select instance_name from v$instance
      

      在sqlplus中获取实例或设置

      set sqlprompt "_USER'@'_CONNECT_IDENTIFIER> "
      

      【讨论】:

        【解决方案7】:
        select * from v$session
        where sid = to_number(substr(dbms_session.unique_session_id,1,4),'XXXX')
        

        【讨论】:

        • 从 v$mystat 中选择 sid,其中 rownum = 1? ;)
        猜你喜欢
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2012-07-08
        • 1970-01-01
        • 2014-12-22
        相关资源
        最近更新 更多