• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PL/SQL 実行中のSID)

PL/SQL 実行中のSIDを取得する方法

このQ&Aのポイント
  • 自作のストアドプロシージャで実行中の関数のSIDを取得する方法を知りたいです。
  • DBMS_**** パッケージの使用例を紹介するので、関数の実行時にSIDと関数名を取得できる方法を教えてください。
  • PL/SQLで特定の関数の実行時に実行中のセッションのSIDと関数名を記録する方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

dda167さん 蛇足や余計なお世話などではありませんね。 質問者さんの欲しい値を取るには、 select SYS_CONTEXT ('USERENV', 'SID') from dual; こちらですね・・・ ご指摘ありがとうございました。 また、関数名について回答していませんでした。 確実に使えるかは分からないですが、DBMS_UTILITY.FORMAT_CALL_STACKの戻り値のコールスタックの内容から取得できるかもしれません。 当方の環境(10g XE)で少し試してみました。 インデントしていないので見づらいですが・・ --ストアド名を返すファンクション create or replace function get_name return varchar2 is callstack varchar2(2000); currentname varchar2(2000); begin callstack := DBMS_UTILITY.FORMAT_CALL_STACK; /* コールスタックの最初には、このファンクション自身の情報が入っているため 2つ目のストアド名を取得する */ currentname := regexp_substr(callstack, 'procedure.+$|function.+$|package.+$',1,2,'im'); return currentname; end; / --上記ファンクションを呼ぶだけのファンクション create or replace function func_a return number is begin dbms_output.put_line(get_name); return 0; end; / --プロシージャ create or replace procedure proc_a is begin dbms_output.put_line(get_name); end; / --パッケージ create or replace package pack_a is procedure proc_a; end; / create or replace package body pack_a is procedure proc_a is begin dbms_output.put_line(get_name); end; end; / --無名ブロックで上記ファンクションらを実行 set serveroutput on declare w_num number; begin w_num := func_a; --function スキーマ名.FUNC_A proc_a; --procedure スキーマ名.PROC_A pack_a.proc_a; --package body スキーマ名.PACK_A end; / set serveoutput off 無名ブロックのコード内にある、コメントの内容が出力されました。 パッケージの場合は、プロシージャ名までは取得できないようです。 参考になれば幸いです。

shingo-numtech
質問者

お礼

詳しい情報をありがとうございました これからいろいろと試してみたいと思います

その他の回答 (2)

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

蛇足(余計なお世話)ですが SYS_CONTEXTで取得するSESSIONIDは、V$SESSIONのAUDSIDです。 念のためです。失礼しました。

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

select SYS_CONTEXT ('USERENV', 'SESSIONID') from dual; でセッションIDが取得できます。 http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions184.htm