概要
utl_lmsパッケージのformat_message関数は本来エラー処理に使うものらしいですが、
使用にあたり特別な要件がないため、簡易なフォーマット関数(CやPHPでいうsprintf、pythonでいうformat)の代用品として使うことが出来ます。
PL/SQLの中でしか使えないなど制限事項が多いですが、それでも || による無様な文字列結合から開放されますのでデバッグメッセージやexecute immediate等で使う複雑なクエリを構築する場合に便利です。
utl_lms.format_messageの構文
function FORMAT_MESSAGE (
format IN VARCHAR2,
args ...)
RETURN VARCHAR2;
パラメータ | 型 | 概要 |
---|---|---|
format | VARCHAR2 | 書式指定文字列 |
args | (任意) | データ(可変個数) |
戻り値 | VARCHAR2 | フォーマット済文字列 |
詳細はこちら
https://docs.oracle.com/cd/E16338_01/appdev.112/b56262/u_lms.htm
補足
- 通常のSQLクエリの中では使えません。PL/SQLのプロシージャだけです(可変引数だからかも)
- 実質、使える型は文字列型(%s)のみ
- それ以外の型は事前にTO_CHARで変換して%sに割り当てればOK
- 形式指定パラメータのようなもの無いみたいです。
- 実は整数型(%d)も使えるには使えるのですが・・・
- 対応している型はPLS_INTEGERとBINALY_INTEGERのみです。
- NUMBER型にはまともに対応しておらず、代入してもエラーにもならず何も出てこないという挙動のため間違えて使うと厄介です。
- 用途がかなり限定されるので数値を扱うなら素直にTO_CHARで変換して%sに代入したほうが良いです。
- %自体の出力は%%。
- utl_lmsが実装されているのは10g以降。
実行例
set serveroutput on
declare
s char(100);
I1 PLS_INTEGER := 1;
S2 CHAR(10) := 's2';
N4 NUMBER(2,0) := 4;
V5 VARCHAR2(10) := 'VC5';
begin
s := utl_lms.format_message('INSERT INTO DATA1(KEY,VAL,REMARK)VALUES(%d,''%s'',''%s''); --<%d,%s>', I1, S2, 'A3', N4, V5);
dbms_output.put_line(s);
end;
/
結果
INSERT INTO DATA1(KEY,VAL,REMARK)VALUES(1,'s2 ','A3'); --<,VC5>