-PR-
  • 困ってます
  • 質問No.7805197
解決
済み

PL/SQL 実行中のSID

  • 閲覧数868
  • ありがとう数6
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 88% (24/27)

自作のストアドプロシージャのどの関数がいつ呼ばれたかを記録したいと思いました。
例えば FUNC_A という関数があって、その関数の先頭で、その関数を実行しているセッションのSIDと関数名を取得できないものでしょうか。

そのようなパッケージ DBMS_**** みたいなものがあって、下記のような感じで使えたらなあと考えています。
------------------
FUNC_A
IS
sid NUMBER;
funcName VARCHAR2(30);
BEGIN
SELECT DBMS_****.GET_EXECUTING_SID INTO sid FROM DUAL;
SELECT DBMS_****.GET_CURRENT_FUNC INTO funcName FROM DUAL;
...
(sid と funcName を現時刻とともに記録)
END;
------------------

このような目的に合致したパッケージ、あるいはこの目的を実現する方法などありますでしょうか。

よろしくお願いします
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル12

ベストアンサー率 68% (258/374)

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

お礼率 88% (24/27)

詳しい情報をありがとうございました
これからいろいろと試してみたいと思います
投稿日時 - 2012-11-20 15:00:28
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル12

ベストアンサー率 68% (258/374)

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

でセッションIDが取得できます。

http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions184.htm
  • 回答No.2
レベル9

ベストアンサー率 76% (55/72)

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

SYS_CONTEXTで取得するSESSIONIDは、V$SESSIONのAUDSIDです。

念のためです。失礼しました。
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ