
自作のストアドプロシージャのどの関数がいつ呼ばれたかを記録したいと思いました。
例えば 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;
------------------
このような目的に合致したパッケージ、あるいはこの目的を実現する方法などありますでしょうか。
よろしくお願いします
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
無名ブロックのコード内にある、コメントの内容が出力されました。
パッケージの場合は、プロシージャ名までは取得できないようです。
参考になれば幸いです。
No.1
- 回答日時:
select SYS_CONTEXT ('USERENV', 'SESSIONID') from dual;
でセッションIDが取得できます。
http://docs.oracle.com/cd/E16338_01/server.112/b …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL 数値が定期的にあらわれる文字列から、いくつめに出現した数値が指定して切り出したい 1 2023/06/08 13:12
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ストアドプロシジャからストア...
-
Function内に記述したdbms_outp...
-
ストアドプロシージャ結果のフ...
-
ストアド実行時のエラー「参照...
-
プロシージャ 引数 指定
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
SQL(SELECT文)を教えてください
-
今日の日付が入った行のデータ...
-
【Excel VBA】 WorksheetやRa...
-
Access VBAで行ラベルが定義さ...
-
日付型カラムへのデータINSERT
-
SQL Serverの型変換について
-
OutlookVBAで作成したマクロに...
-
SQLサーバで和暦から西暦に変換...
-
Texの枠囲み調節
-
日付書式に変換でこまっています!
-
PL/SQLでSPOOLさせたいのですが...
-
外部結合と等価結合のパフォー...
-
ODBCリンクの際にACCESSでは読...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ストアドプロシジャからストア...
-
ストアド実行時のエラー「参照...
-
PL/SQL exceptionを呼び出すには?
-
時間項目を60進数から10進数へ...
-
INSERT文の書式
-
PL/SQLで連結(||)と結合(=>)の違い
-
PL/SQL 実行中のSID
-
パッケージ内のファンクション...
-
質問:DBMS_OUTPUTの使用方法
-
PL/SQLについて
-
PL/SQLの例外
-
ストアドプロシージャからアナ...
-
ストアドプロシージャ結果のフ...
-
Function内に記述したdbms_outp...
-
ROW_NUMBER()を使用したデータ取得
-
OracleのTEXT_IOについて
-
ストアドプロシージャからスト...
-
PL/SQLに関して
-
PL/SQLのファンクションでのOUT...
-
プロシージャ 引数 指定
おすすめ情報