Orafce ホームページへようこそ

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 での動作については以下のリンクを参照してください。


  1. インストール
  2. 注意:互換性の無い箇所
  3. 一般関数
    1. 日付関数
    2. nlssort 関数
    3. 文字列関数
    4. その他の関数
  4. DBMS_ALERT
  5. DBMS_OUTPUT
  6. UTL_FILE
  7. DBMS_PIPE
  8. DBMS_ASSERT
  9. DBMS_UTILITY
  10. PLVision フレームワーク
    1. PLVdate
    2. PLVstr
    3. PLVchr
    4. PLVsubst
    5. PLVlex
    6. PLUnit

インストール

インストール方法は、一般的な 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 項目でもあります。

to_date() での spth 書式が存在しない。
現在 to_date() は PostgreSQL の関数を流用していますが、独自に再実装する必要があります。
to_date() での月、日のオーバーフローがエラーにならない。
例えば「13月」は、PostgreSQL では翌年1月になりますが、Oracle ではエラーになります。

一般関数

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 与えた変換書式に切り上げる。

nlssort 関数

ロケール (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 のインストール後に定義を追加してください。 circle 型に対応した、引数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;

DBMS_ALERT

このパッケージは非同期のアラートを扱います。 この機能は 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 での動作と異なります。 動作の違いにより、以下のような問題が生じるかもしれません:

DBMS_OUTPUT

このパッケージは 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 に返す。

UTL_FILE

このパッケージはテキストファイルの操作(読み書き)を提供します。 ファイルの操作は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] [, encoding]) file file_type ファイル location/filename を開き、記述子を返す。 mode は r:読み, w:書き, a:追記 のいずれかである。 encoding はファイルの文字エンコーディングであり、省略時にはサーバエンコーディングを用いる (独自拡張)。 エラーの際は例外が発生する。
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 (独自関数) 一時ディレクトリのパスを返す。

DBMS_PIPE

このパッケージは非同期のセッション間通信の機能を提供します。 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)

DBMS_ASSERT

このパッケージは 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オブジェクト名かを検証する。

DBMS_UTILITY

コールスタックを取得する関数を提供します。

関数名説明
format_call_stack() コールスタックを複数行の文字列として返します。

PLVision フレームワーク

このパッケージは PLVision フレームワーク (サードパーティ制の PL/SQL 拡張ライブラリ) を部分的に実装しています。

PLVdate

このパッケージはカレンダーを操作する関数を含みます。 カレンダーは用途に応じて自由にカスタマイズできます(休日や土曜出勤など)。 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, ...

PLVstr

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

PLVchr

関数名説明
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

PLVsubst

このパッケージは文字列中のシンボルを置換する関数を提供します。 用途としては、ヘルプ文字列、エラーメッセージ、ログなどの整形があります。 置換するシンボルの初期値は '%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

PLVlex

このパッケージは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 が生成されるかを指定します。

PLUnit

このパッケージは診断(ユニットテスト)用の関数を含みます。

関数名説明
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.

バグ、非互換性、関数やパッケージの追加要望は、メーリングリスト または フォーラム へお願いします。