Oracle 互換関数
orafce の目的は Oracle Database で使用できる関数と互換性のある関数を PostgreSQL に実装することです。 日付関数 (next_day, last_day, trunc, round, ...), 文字列関数とパッケージ (DBMS_ALERT, DBMS_OUTPUT, UTL_FILE, DBMS_PIPE, ...) の大部分はすでに実装済みです。 Oracle 10g と同様の動作をするよう検証されています。 このモジュールは、Oracle から PostgreSQL へのデータベース移行で役に立ちます。
この orafce プロジェクトは PostgreSQL コミュニティによる pgFoundry の中のプロジェクトです。
日本語以外のドキュメントは、下記のリンクを参照してください。
Oracle Database での動作については以下のリンクを参照してください。
インストール方法は、一般的な PostgreSQL の contrib モジュールと同様です。 orafce の書庫を contrib ディレクトリの中で展開し、orafce ディレクトリへ入ります。 make, make install を行ってライブラリがインストールします。 その後、データベースへ登録するために orafunc.sql スクリプトを実行します。
cp orafce-2.0.1-preview.tgz /usr/loca/src/pgsql/contrib
cd /usr/local/src/pgsql/contrib
tar xvfz orafce-2.0.8-pre.tgz
cd orafce
make
make install
# make installcheck
psql mojedb
\i orafunc.sql
SELECT next_day(current_date,'saturday');
以下の処理に、Oracle との互換性が無いことが確認されています。 これらは ToDo 項目でもあります。
orafce は追加の一般関数を提供します。 PostgreSQL が既にサポートしている関数については「関数と演算子」を参照して下さい。
orafce は追加の日付関数を提供します。 PostgreSQL が既にサポートしている日付関数については「日付/時刻関数と演算子」を参照して下さい。
SELECT add_months(date '2005-05-31',1); -- > 2005-06-30
SELECT last_day(date '2005-05-24'); -- > 2005-05-31
SELECT next_day(date '2005-05-24', 'monday'); -- > 2005-05-30
SELECT next_day(date '2005-05-24', '月曜日'); -- > 2005-05-30
SELECT next_day(date '2005-05-24', 2); -- > 2005-05-30
SELECT months_between(date '1995-02-02', date '1995-01-01'); -- > 1.0322580645161
SELECT trunc(date '2005-07-12', 'iw'); -- > 2005-07-11
SELECT round(date '2005-07-12', 'yyyy'); -- > 2006-01-01
trunc(), round() 関数の引数の変換書式には、下記の表に示した書式が使用できます。
関数名 | 説明 |
---|---|
Y,YY,YYY,YYYY,SYYY,SYEAR | year |
I,IY,IYY,IYYY | iso year |
Q | quarter |
WW | week, the first day in week is the first day in year |
IW | week, the first day is Monday |
W | week, the first day is the first day in month |
DAY,DY,D | week, the first day is Sunday |
MONTH,MON,MM,RM | month |
CC,SCC | century |
DDD,DD,J | day |
HH,HH12,HH24 | hour |
MI | minute |
関数で端数が丸められる場合、年の場合は 7月1日、月の場合は 16日、週の場合は木曜日が境界になります。
関数名 | 説明 |
---|---|
add_months(date, integer) date | Add n months |
last_date(date) date | 月の最終日を返す。 |
next_day(date, text) date | 第1引数の日付以降の、第2引数の曜日を返す。第2引数は曜日の名前を渡す (例: Thursday, 火曜日) |
next_day(date, integer) date | 第1引数の日付以降の、第2引数の曜日を返す。第2引数は曜日の番号を渡す (1..7 = 日..土) |
months_between(date, date) float8 | 引数の日付の差を月単位で返す。月の日数は31日で計算されるが、月末同士の場合は差は整数になる。 |
trunc(date, text) date | 与えた変換書式に切り捨てる。 |
round(date, text) date | 与えた変換書式に切り上げる。 |
ロケール (locale) に基づいた文字列の比較を行う場合、データベース (8.4~) またはデータベース・クラスタ (~8.3) 単位で同一のロケールを使用する必要があります。 nlssort 関数を使用すると、文字列の比較ごとに異なるロケールを使用する (COLLATE) ことができます。 使用するロケールは nlssort 関数の引数として渡すか、先に set_nls_sort で設定しておきます。
設定するロケールは必ずサーバの文字エンコーディングと一致させてください。 例えば、文字エンコーディングとして eucjp を使用している場合、ja_JP.utf-8 は不適切であり、ja_JP.eucJP を使う必要があります。
SELECT * FROM peoples ORDER BY nlsstring(surname, 'de_DE.UTF-8');
SELECT set_nls_sort('cs_CZ.UTF-8');
SELECT * FROM peoples ORDER BY nlsstring(surname);
PostgreSQL が既にサポートしている文字列関数については「文字列関数と演算子」を参照して下さい。
これらの関数は Oracle からの移植の際にできる限りコードの書き換えを避けたい場合にのみ使用してください。 より適切な方法は、標準SQLで規定されている関数に置き換えることです。
関数名 | 説明 |
---|---|
instr (text, text, [int[, int]]) | 部分文字列の位置を返す。 |
reverse (text) | 文字の並びを反転して返す。 |
oracle.substr (text, [int [,int]]) | 部分文字列を返す(Oracle との互換性を向上)。 |
oracle.substr() は pg_catalog.substr() を残したままインストールされます。 デフォルトのスキーマ検索の順序では pg_catalog のほうが優先度が高いため、orafce 版の substr() を使うためには 設定パラメータ search_path を 'oracle, pg_catalog, "$user", public' と変更する必要があります。
nvl() や decode() は、Oracle からの移植の際にできる限りコードの書き換えを避けたい場合にのみ使用してください。 より適切な方法は、標準SQLで規定されている COALESCE や CASE に置き換えることです。
関数名 | 説明 |
---|---|
nvl (anyelement, anyalement) | 最初の非NULLの引数を返す。 |
nvl2 (anyelement, anyememet, anyelement) | 第1引数が非NULLの場合は第2引数を、さもなければ第3引数を返す。 |
lnnvl (boolean) | 第1引数が false または NULL の場合は true、さもなければ false を返す。 |
concat (anyelement, anyelement) | 文字列を連結する。|| 演算子とは異なり NULL を空文字として扱う。 |
decode (lhs, [rhs1, result1], ... , default = NULL) | lhs = rhsN ならば resultN を返します。一致が無ければ default を返します。 下記「decode()に関する注意」も参照してください。 |
dump (data, format) | data の内部表現を format 形式で返す。 |
bitand (bigint, bigint) | ビット和を返す。& 演算子と同じ。 |
sinh (float8) | ハイパボリック・サイン。 |
cosh (float8) | ハイパボリック・コサイン。 |
tanh (float8) | ハイパボリック・タンジェント。 |
nanvl (float, float) | 第1引数が NaN で無ければその値を返す。NaN の場合は第2引数を返す。 |
to_multi_byte (text) | シングルバイト(半角)の英数記号を対応するマルチバイト文字(全角)に変換します。 |
decode()に関する注意 : decode() 関数は、任意の型を引数として与えることができます。 しかし、PostgreSQL 母体の制限により、最初から全ての型を扱うことができません。 予め char, varchar, text, integer, bigint, numeric, time, date, timestamp, timestamp with time zone については定義されていますが、これ以外の型を返却したい場合には、orafce のインストール後に定義を追加してください。 circlr 型に対応した、引数5個のバージョン decode() の定義を以下に示します。 内部関数 ora_decode() 自体は任意の個数の任意の型に対応しており、引数の数や型によらず ora_decode を指定できます。 詳しくは orafunc.sql の decode() の定義も参考にして下さい。
CREATE FUNCTION decode(anyelement, anyelement, circle, anyelement, circle) RETURNS circle AS 'MODULE_PATHNAME', 'ora_decode' LANGUAGE C IMMUTABLE;
このパッケージは非同期のアラートを扱います。 この機能は PostgreSQL の LISTEN / NOTIFY と似ていますが、サーバ内でのみアラートを使用できます。
このパッケージが dbms_pipe パッケージと異なる点は、複数の受信者に対してメッセージを送信できることです。 dbms_pipe は 2つのセッション間の双方向通信に使用し、dbms_alert は1つのセッションから複数の別セッションへの単方向通信として使用するのに適しています。
-- session pavel
pavel# SELECT dbms_alert.register('ahoj');
pavel# SELECT * FROM dbms_alert.waitany(NULL);
-- session root
root# SELECT dbms_alert.signal('ahoj','Gertrudo');
関数名 | 説明 |
---|---|
register (name text) | 名前 name のアラートを登録する。 |
remove (name text) | 名前 name のアラートを登録解除する。 |
removeall () | すべてのアラートを登録解除する。 |
signal (name text, message text) | アラートを通知する。 |
waitany (OUT name text, OUT message text, OUT status integer, n float8) | いずれかのアラートが通知されるまで最大 n 秒待機する。 |
waitone (name text, OUT message text, OUT status integer, n float8) | 名前 name のアラートが通知されるまで最大 n 秒待機する。 |
set_defaults | (未実装) |
メッセージは操作のたびに送信されます。 これは、トランザクションの完了時に送信が行われる LISTEN / NOTIFY や Oracle での動作と異なります。 動作の違いにより、以下のような問題が生じるかもしれません:
このパッケージは Oracle の PL/SQL で使用される通知の機能を移植したものです。 PostgreSQL の PL/pgSQL にも同様の機能として RAISE NOTICE があります。
PostgreSQL はプロトコル層で通知メッセージを扱えます。 サーバが非同期メッセージを送信すると、クライアントはそのメッセージをすぐに受信します。 そのため、Oracle での動作と比較するとメッセージを受けとるタイミングが異なる場合があります。 (Oracle ではトランザクションの終了時にメッセージをまとめて受信します。)
-- new session
SELECT dbms_output.enable();
SELECT dbms_output.put_line('first_line');
SELECT dbms_output.put_line('next_line');
SELECT * from dbms_output.get_lines(0);
-- new sesion
SELECT dbms_output.serveroutput('on');
SELECT dbms_output.put_line('first_line');
Oracle と同様に、複数のメッセージがある場合にはまとめて送信されます。 受信者は 1回のシグナルで複数のメッセージを受信することになります。
関数名 | 説明 |
---|---|
enable([buffer_size int4]) | このパッケージの機能を有効化する。 |
disable() | このパッケージの機能を無効化する。 |
serveroutput(bool) | クライアントへメッセージを送信するかを指定する。 |
put(text) | 文字列を追加する。 |
put_line(text) | 文字列と改行を追加する。 |
new_line() | 改行を追加する。 |
get_line(OUT line text, OUT status int4) | バッファから1行読む。読めれば status に 0 を、さもなければ 1 を返す。 |
get_lines(OUT lines text[], INOUT numlines int4) | バッファから lines 行読む。読めた行数を numlines に返す。 |
このパッケージはテキストファイルの操作(読み書き)を提供します。 ファイルの操作はC言語のストリーム (FILE) 操作に似た形式です。 ファイルの読み書きが可能なディレクトリを制限できるため、適切なアクセス制限を行っていればこのパッケージを利用してもセキュリティ上の問題はありません。
CREATE OR REPLACE FUNCTION read_file(loc text, filename text)
RETURNS SETOF text AS $$
DECLARE
f utl_file.file_type;
BEGIN
f := utl_file.fopen(loc, filename, 'r');
LOOP
RETURN NEXT utl_file.get_line(f);
END LOOP;
EXCEPTION
WITH NO_DATA_FOUND THEN
f := utl_file.fclose(f);
RETURN;
WITH OTHERS THEN
IF utl_file.is_open(f) THEN
f := utl_file.fclose(f);
END IF;
RAISE EXCEPTION '%', SQLERRM;
END;
$$ LANGUAGE plpgsql VOLATILE;
関数名 | 説明 |
---|---|
fclose(file file_type) file_type | 指定したファイを閉じ NULL を返す。 |
fclose_all() | セッションで開いたすべてのファイルを閉じる。 |
fcopy(srcdir, srcname, dstdir, dstname, start_line = 1, end_line = NULL) | ファイル srcdir/srcname を dstdir/dstname へコピーする。 コピー範囲は行番号で与え、start_line ~ end_line の範囲である。 |
fflush(file file_type) | バッファをディスクへフラッシュする。 |
fgetattr(location, filename) : OUT (fexists, file_length, blocksize) | ファイル location/filename の存在有無とサイズ情報を取得する。 |
fopen(location, filename, mode [, max_linesize]) file file_type | ファイル location/filoename を開き、記述子を返す。 mode は r:読み, w:書き, a:追記 のいずれかである。 エラーの際は例外が発生する。 |
frename(srcdir, srcname, dstdir, dstname, overwrite = false) | ファイル srcdir/srcname を dstdir/dstname へ名前変更または移動する。 |
get_line(file file_type) text | テキストファイルから1行読む。末尾の改行は返されない。 行の長さがバッファ長 (デフォルト 1kB) よりも長い場合はバッファに保持可能な部分のみを返し、残りは次回の呼び出しで読まれる。 ファイル末尾を越えて読もうとすると NO_DATA_FOUND 例外が発生する。 |
get_nextline(file file_type) text | (独自関数) get_line と同様だが、ファイル末尾を越えて読もうとすると NULL を返す。 |
is_open(file file_type) boolean | ファイルが開かれているか否かを返す。 |
new_line(file file_type, n = 1) | 改行を n 個追加する。 |
put(file file_type, buffer text) | 文字列を追加する。 |
put_line(file file_type, buffer text) | 文字列と改行を追加する。 |
putf(file file_type, format text, arg1..arg5 text) | 書式付き文字列を追加する。文字列 format 中の N 番目の %s は argN に置換される(最大5個)。 | tmpdir(file file_type) text | (独自関数) 一時ディレクトリのパスを返す。 |
このパッケージは非同期のセッション間通信の機能を提供します。 PostgreSQL 単体ではセッション間通信に相当する機能はありません。 通信メッセージは空または任意の数の値を含みます。 値は共有メモリの許す限りいくつでも含むことができます。 このパッケージの用途は、試験 (デバッグレポートの転送) や、PL/pgSQL を使用するアプリケーションでクライアント・サーバ型のアーキテクチャを模すことです。 作成可能なパイプには private と public の2種類があります。 public パイプは誰でも操作することができます。
同様にセッション間通信機能を提供する dbms_alert パッケージとの主な違いは以下です:
-- Session A
SELECT dbms_pipe.pack_message(CURRENT_DATE);
SELECT dbms_pipe.pack_message('Servus, Rupert');
SELECT dbms_pipe.send_message('boo',4,10);
-- Session B
SELECT dbms_pipe.receive_message('boo',4);
SELECT dbms_pipe.unpack_message_date();
SELECT dbms_pipe.unpack_message_text();
Oracle では OUT 引数の違いによる関数のオーバーロードが可能ですが、PostgreSQL ではできません。 そのため、unpack_message 関数を、関数名の末尾に _text, _date, _timestamp, _number, _bytea, _record が追加された複数の関数に分割しています。
RECORD 型を転送するサンプルコードを以下に示します。
CREATE TYPE info AS (x integer, y integer);
CREATE OR REPLACE FUNCTION send_info(x int, y int)
RETURNS void AS $$
DECLARE i info;
BEGIN i.x := x; i.y := y;
PERFORM dbms_pipe.pack_message(i);
PERFORM dbms_pipe.send_message('info');
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION get_info()
RETURNS info AS $$
DECLARE i info;
BEGIN
PERFORM dbms_pipe.receive_message('boo');
SELECT INTO i * FROM dbms_pipe.unpack_message_record() AS (x integer, y integer);
RETURN i;
END;
$$ LANGUAGE plpgsql;
Oracle と比較して以下の違いがあります。
関数名 | 説明 |
---|---|
pack_message(value text|date|timestamp|numeric|record|bytea) | データをローカルバッファへ送る。 |
unpack_message_text() text | ローカルバッファから text を取り出す。 |
unpack_message_date() date | ローカルバッファから date を取り出す。 |
unpack_message_timestamp() timestamp | ローカルバッファから timestamp を取り出す。 |
unpack_message_number() numeric | ローカルバッファから numeric を取り出す。 |
unpack_message_record() record | ローカルバッファから record を取り出す。具体的な型にキャストして使う。 |
unpack_message_bytea() bytea | ローカルバッファから bytea を取り出す。 |
send_message(pipe text [,timeout int] [,limit int]) int | ローカルバッファを名前 pipe のパイプを使って送信する。 指定したパイプが存在しなければ新たに public パイプを作成する。 正常に送信できれば 0 を、タイムアウトすれば 1 を返す。 第2引数 timeout はタイムアウトを表し、秒単位で与える(デフォルトは無期限)。 第3引数 limit はパイプが保持できる最大データ数である。 |
receive_message(pipe text [,timeout int]) int | パイプからデータを受信する。 正常に受信できれば 0 を、タイムアウトすれば 1 を返す。 第2引数 timeout はタイムアウトを表し、秒単位で与える(デフォルトは無期限)。 |
create_pipe(pipe text, limit int [,private bool]) create_pipe(pipe text [,limit int]) |
指定した属性を持つパイプを作成する。 |
remove_pipe(pipe text) | パイプを削除する。 |
reset_buffer() | 送信または受信に使用するローカルバッファを空にする。 |
purge(pipe text) | パイプを空にする。 |
next_item_type() int | 次のデータの型を取得する (0:次は無い, 9:numeric, 11:text, 12:date, 13:timestamp, 23:bytea, 24:record) |
unique_session_name() text | セッションの一意識別子を「PG$PIPE$id$pid」形式で返す。 |
使用中のパイプの情報は dbms_pipe.db_pipes ビューから参照できます。
postgres=# SELECT * from dbms_pipe.db_pipes;
name | items | size | limit | private | owner
------+-------+------+-------+---------+-------
boo | 1 | 32 | | f |
(1 row)
このパッケージは SQL インジェクションを防ぐために使用されます。
関数名 | 説明 |
---|---|
enquote_literal(varchar) varchar | クォートを先頭と末尾に追加し、すべてのシングルクォートがペアになっていることを検証する。 |
enquote_name(varchar, boolean = false) varchar | ダブルクォートを先頭と末尾に追加する。第2引数がtrueの場合には小文字に変換する。 (注意:Oracleでは大文字に変換する。ダブルクォートされていない識別子を大文字/小文字のどちらで扱うかが DB 間で異なるため。) |
noop(varchar) varchar | 引数をそのまま返す。 |
qualified_sql_name(varchar) varchar | 識別子として適切な書式かを検証する。 |
schema_name(varchar) varchar | 存在するスキーマ名かを検証する。 |
simple_sql_name(varchar) varchar | 単純な識別子として適切な書式かを検証する。 |
object_name(varchar) varchar | 存在するSQLオブジェクト名かを検証する。 |
コールスタックを取得する関数を提供します。
関数名 | 説明 |
---|---|
format_call_stack() | コールスタックを複数行の文字列として返します。 |
このパッケージは PLVision フレームワーク (サードパーティ制の PL/SQL 拡張ライブラリ) を部分的に実装しています。
このパッケージはカレンダーを操作する関数を含みます。 カレンダーは用途に応じて自由にカスタマイズできます(休日や土曜出勤など)。 For convenience the distribution contents calendars for Bohemian, all neighbour countries and some other. Our own holidays or spare-time days can be input in the calendar.
SELECT plvdate.plvdate.default_holydays('czech');
SELECT plvdate.add_bizdays(CURRENT_DATE, 10);
SELECT plvdate.isbizday('2006-12-25');
SELECT plvdate.set_nonbizday('Friday');
関数名 | 説明 |
---|---|
add_bizdays(day date, days int) date | Add n work days |
nearest_bizday(day date) date | Return the nearest work day |
next_bizday(day date) date | Return the next work day |
bizdays_between(day1 date, day2 date) int | Return the number of work days between day1 and day2 |
prev_bizday(day date) date | Return the previous work day |
isbizday(date) bool | Test if the day is work day |
set_nonbizday(dow varchar) | Set day of the week as spare-time day |
unset_nonbizday(dow varchar) | Set day of the year as work day |
set_nonbizday(day date) | Nastavi den v roce jako mimopracovni |
unset_nonbizday(day date) | Set day of the year as work day |
set_nonbizday(day date, repeat bool) | Set day as spare-day, if repeat is true, day is taken as holiday |
use_easter() | Calendar consider Easter |
unuse_easter() | Calendar does not consider Easter |
use_easter(useit boolean) | |
using_easter() bool | Return true, if calendar consider Easter |
include_start() | bizdays_between consider the first day |
noinclude_start() | |
include_start(include boolean) | |
including_start() bool | |
default_holydays(country text) | Load the default calendar - czech, german, slovakia, ... |
PLVision には数十個の文字列と文字を操作する関数が含まれますが、orafce モジュールはその中から一般的な関数のみを実装しています。 含まないのは、PL 関数のソースコードを解析する関数などです。 提供される関数で特徴的なのは、文字列中の位置として負の値をサポートすることです。 位置として負の値を与えた場合、文字列の先頭からではなく、末尾から数えた位置を指定することになります。
plvstr.left('abcdef',2) -> ab
plvstr.left('abcdef',-2) -> abcd
plvstr.substr('abcdef',1,1) -> a
plvstr.substr('abcdef',-1,1) -> f
plvstr.substr('abcde',-2,1) -> d
関数名 | 説明 |
---|---|
normalize(str text) | White letters will be replaced by spaces, array of spaces wiil be replaced by one space. |
is_prefix(str text, prefix text, cs bool) | Return true, if the prefix is string str. prefix. Parameter cs - case sensitive |
is_prefix(str text, prefix text) | Return true, if the prefix is string str. prefix |
is_prefix(str int, prefix int) | Return true, if the prefix is number str prefix |
is_prefix(str bigint, prefix bigint) | Return true, if the prefix is number str prefix |
substr(str text, start int, len int) | Return symbol length beginning of start position |
substr(str text, start int) | Return string from the beginning to the end |
instr(str text, patt text, start int, nth int) | Search template in string, what nth appearance |
instr(str text, patt text, start int) | Search template in string |
instr(str text, patt text) | Search template in string |
lpart(str text, div text, start int, nth int, all_if_notfound bool) | Return letters on the left side from found pattern div, begin searching on start position, search nth pattern appearance, if all_if_notfound is true, return whole string after not founding pattern, otherwise return NULL |
lpart(str text, div text, start int, nth int) | Return letters on the left side from found pattern div, begin searching on start position, search nth pattern appearance |
lpart(str text, div text, start int) | Return letters on the right side from found pattern div, begin searching on start position |
lpart(str text, div text) | Return letters on the left side from found pattern div |
rpart(str text, div text, start int, nth int, all_if_notfound bool) | Return letters on the left side from found pattern div, begin searching on start position, search nth pattern appearance, if all_if_notfound is true, return whole string after not founding pattern, otherwise return NULL |
rpart(str text, div text, start int, nth int) | Return letters on the left side from found pattern div, begin searching on start position, search nth pattern appearance |
rpart(str text, div text, start int) | Return letters on the right side from found pattern div, begin searching on start position |
rpart(str text, div text) | Return letters on the left side from found pattern div |
lstrip(str text, substr text, num int) | Despatch n iteration of substr pattern on the left side of string |
lstrip(str text, substr text) | Despatch repeated substr pattern on the left side of string |
rstrip(str text, substr text, num int) | Despatch repeated substr pattern on the right side of string |
rstrip(str text, substr text) | Despatch repeated substr pattern on the right side of string |
rvrs(str text, start int, _end int) | Turn the part of string from start to _end round |
rvrs(str text, start int) | Turn the part of string from start position to end round |
rvrs(str text) | Turn string round |
left(str text, n int) | Return first n letter from the left side. If n is negative, return first to n letters from the right side |
right(str text, n int) | Return first n letter from the right side. If n is negative, return last to n letters from the left side |
関数名 | 説明 |
---|---|
nth(str text, n int) | Return n-th letter in string |
first(str text) | Return the first letter |
last(str text) | Return the last letter |
is_blank(c int) | Is the letter empty? |
is_blank(c text) | Is the letter empty? |
is_digit(c int) | Is the letter number? |
is_digit(c text) | Is the letter number? |
is_quote(c int) | Is the letter apostroph? |
is_quote(c text) | Is the letter apostroph? |
is_other(c int) | Is it anything else, not ASCII letter |
is_other(c text) | Is it anything else, not ASCII letter |
is_letter(c int) | Is the letter char? |
is_letter(c text) | Is the letter char? |
char_name(c text) | Return the name of letter, interesting especially for white letters |
quoted1(str text) | Insert text between ''' |
quoted2(str text) | Insert text between '"' |
stripped(str text, char_in text) | Despatch char_in letters from string |
このパッケージは文字列中のシンボルを置換する関数を提供します。 用途としては、ヘルプ文字列、エラーメッセージ、ログなどの整形があります。 置換するシンボルの初期値は '%s' ですが、セッションごとに変更することもできます。 置換後の文字列は、配列または区切り文字 (初期値は ',') で連結した文字として与えます。
postgres=# SELECT plvsubst.string('My name is %s %s', ARRAY['Pavel','Sthule']);
string
-------------------------
My name is Pavel Sthule
(1 row)
関数名 | 説明 |
---|---|
setsubst ([varchar = '%s']) | Set substitute symbol valid in the session |
subst () | Return valid substitute symbol |
string (text, text[] [, text = '%s']) | Substitute all substitute symbols by array members |
string (text, text [, text = ',' [, text = '%s']]) | Substitute all substitute symbols by list members |
このパッケージは1個の関数を含み、SQL 文字列のトークンを表として返します。 code 値は PostgreSQL のバージョンごとに異なる値になる場合もあります。
postgres=# SELECT * FROM plvlex.tokens('SELECT t.* FROM tabulka t WHERE t.i = 10',true, true);
pos | token | code | class | separator | mod
-----+---------+------+---------+-----------+------
0 | select | 527 | KEYWORD | |
7 | t | | IDENT | |
8 | . | 46 | OTHERS | | self
9 | * | 42 | OTHERS | | self
11 | from | 377 | KEYWORD | |
16 | tabulka | | IDENT | |
24 | t | | IDENT | |
26 | where | 591 | KEYWORD | |
32 | t.i | | IDENT | |
36 | = | 61 | OTHERS | | self
38 | 10 | | NCONST | | i
(11 rows)
関数名 | 説明 |
---|---|
tokens (text, bool, bool) | SQL の構文解析を行います。 第2引数は空白をスキップするかを指定します。 第3引数は qualified identifiers が生成されるかを指定します。 |
このパッケージは診断(ユニットテスト)用の関数を含みます。
関数名 | 説明 |
---|---|
assert_true(bool [, varchar]) | Asserts that the condition is true. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. |
assert_false(bool [, varchar]) | Asserts that the condition is false. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. |
assert_null(anyelement [, varchar]) | Asserts that the actual is null. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. |
assert_not_null(anyelement [, varchar]) | Asserts that the actual isn't null. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. |
assert_equals(anyelement, anyelement [, double precision] [, varchar]) | Asserts that expected and actual are equal. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. Asserts that expected and actual are within the specified range. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. |
assert_not_equals(anyelement, anyelement [, double precision] [, varchar]) | Asserts that expected and actual are equal. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. Asserts that expected and actual are within the specified range. The optional message will be displayed if the assertion fails. If not supplied, a default message is displayed. |
fail([varchar]) | Fail can be used to cause a test procedure to fail immediately using the supplied message. |