LoginSignup
0
1

More than 5 years have passed since last update.

Oracle DatabaseのPL/SQLでsprintfっぽい事をする

Last updated at Posted at 2018-03-12

概要

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>
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1