Oracle RDBMS の関数とパッケージのサブセットをエミュレートする関数と演算子。
関連する Google グループがあります - https://groups.google.com/forum/?hl=en#!forum/orafce-general
Orafce は、PostgreSQL と互換性のある AWS Aurora と Azure Database for PostgreSQL でサポートされています。
このモジュールには、Oracle アプリケーションを PostgreSQL に移植するのに役立つ、または一般的に役立ついくつかの便利な関数が含まれています。
組み込みの Oracle 日付関数は、Oracle 10 に対して適合性がテストされています。 1960 年から 2070 年の日付範囲は正しく機能します。 「J」形式の場合は 1582-10-05 より前の日付、その他の形式の場合は 1100-03-01 より前の日付は、Oracle のバグのため検証できません。
すべての関数は Oracle と完全な互換性があり、既知のフォーマット文字列をすべて尊重します。詳細な説明はインターネット上で見つけることができます。 「oracle Round trunc date iyyy」のようなキーワードを使用します。
Y,YY,YYY,YYYY,SYYY,SYEAR年 I、IY、IYY、IYYY等年 Q、四半期 WW 週、その日を年の最初の日とする IW 週、月曜日から始まります W 週、日を月の最初の日とする DAY,DY,D 週の最初の日、日曜日 MONTH,MON,MM,RM月 CC、SCC世紀 DDD、DD、J 日 HH、HH12、HH24時間 MI分
関数は切り上げられます。つまり、7 月 1 日の日付は翌年に四捨五入されます。 7月16日は8月に四捨五入されます。
add_months(date, integer) date - 日付に n か月を加えたものを返します。
add_months(日付 '2005-05-31',1) -> 2005-06-30
last_date(date) date - 日付値に基づいて月の最後の日を返します。
last_day(日付 '2005-05-24') -> 2005-05-31
next_day(date, text) date - 日付値より大きい最初の平日を返します。
next_day(日付 '2005-05-24', '月曜日') -> 2005-05-30
next_day(date, integer) 日付 - 上記と同じ。 2 番目の引数は 1..7 で、日曜日から土曜日として解釈される必要があります。
next_day(日付 '2005-05-24', 1) -> 2005-05-30
months_between(date, date) 数値 - date1 と date2 の間の月数を返します。端数の月が計算される場合、months_between 関数は 31 日の月に基づいて端数を計算します。
months_between(日付 '1995-02-02', 日付 '1995-01-01') -> 1.0322580645161
trunc(date, text) date - 指定された形式に従って日付を切り詰めます。
trunc(日付 '2005-07-12', 'iw') -> 2005-07-11
round(date, text) date - 指定された形式に従って日付を丸めます
ラウンド(日付 '2005-07-12', 'yyyy') -> 2006-01-01
to_date(text) タイムスタンプ - 入力テキストをタイムスタンプにタイプキャストします。 GUC orafce.nls_date_format は、この関数の入力テキスト形式を指定するために使用されます。値を空白のままにするか DEFAULT に設定した場合は、PostgreSQL の datestyle GUC 設定に従ってテキスト形式を入力します。
orafce.nls_date_format の値を DEFAULT に設定
to_date('2014-05-19 17:23:53+5:30') -> 2014-05-19 17:23:53
orafce.nls_date_format='YYYY-MMDD HH24:MI:SS'
to_date('2014-0519 17:23:53+5:30') -> 2014-05-19 17:23:53
to_date(text, text) timestamp - 指定された形式で入力テキストをタイムスタンプにタイプキャストします。 GUC orafce.orafce_emit_error_on_date_bug
日付値が日付に関する Oracle バグにヒットしたときにエラーを報告するかどうかを指定するために使用されます。このバグは、 'J'
形式 ( 'J2299159'
) が使用されている場合は1582-10-05
より前の日付で、他の形式では1100-03-01
より前の日付で発生します。デフォルトではエラーがレポートされます。この動作を無効にするにはset orafce.orafce_emit_error_on_date_bug to off
。
SELECT oracle.to_date('112012', 'J'); エラー: Oracle のバグのため、1582-10-05 ('J2299159') より前の日付は検証できません。 SELECT oracle.to_date('1003-03-15', 'yyyy-mm-dd'); エラー: Oracle のバグのため、1100-03-01 より前の日付は検証できません。 orafce.oracle_compatibility_date_limit をオフに設定します。 SELECT oracle.to_date('112012', 'J'); 現在まで ------------------------ 4407-07-30 00:00:00 紀元前 (1行) SELECT oracle.to_date('1003/03/15', 'yyyy/mm/dd'); 現在まで --------------------- 1003-03-15 00:00:00 (1行)
このモジュールには、Oracle 互換の DATE データ型「oracle.date」の実装と、oracle.add_months、oracle.last_day()、oracle.next_day()、oracle.months_between() などの DATE データ型を使用する関数が含まれています。
例:
search_path を oracle、"$user"、public、pg_catalog に設定します。 テーブルoracle_date(col1 date)を作成します。 oracle_date 値に挿入('2014-06-24 12:12:11'::date); oracle_date から * を選択; 列1 --------------------- 2014-06-24 12:12:11 (1行)
oracle.add_months(timestamp with timezone, integer) - 日付と時刻に n か月を加えたものを返します。
oracle.add_months(oracle.date'2005-05-31 10:12:12',1) -> 2005-06-30 10:12:12
oracle.last_day(タイムゾーン付きタイムスタンプ) - 日付値に基づいて月の最後の日を返します。
oracle.last_day(oracle.date '2005-05-24 11:12:12') -> 2005-05-31 11:12:12
oracle.next_day(timestamp with timezone, text) - 日付値より大きい最初の平日を返します。
oracle.next_day(oracle.date '2005-05-24 10:12:12', '月曜日') -> 2005-05-30 10:12:12
oracle.next_day(タイムゾーン付きのタイムスタンプ、整数) - 上記と同じ。 2 番目の引数は 1..7 であり、日曜日から土曜日として解釈される必要があります。
oracle.next_day(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-29 11:21:12
oracle.months_between(timestamp with timezone, timestamp with timezone) - timestamp1 と timestamp2 の間の月数を返します。端数の月が計算される場合、months_between 関数は 31 日の月に基づいて端数を計算します。
oracle.months_between(oracle.date '1995-02-02 10:00:00', oracle.date '1995-01-01 10:21:11') -> 1.03225806451613
oracle.to_date(text,text) - タイムゾーンなしのタイムスタンプを返します。
oracle.to_date('02/16/09 04:12:12', 'MM/DD/YY HH24:MI:SS') -> 2009-02-16 04:12:12
oracle.to_date(text) - oracle.dateを返します。
oracle.to_date('02/16/09 04:12:12') -> 2009-02-16 04:12:12
oracle.sysdate() - サーバーのタイムゾーン(orafce.timezone)でのステートメントのタイムスタンプを返します。
oracle.sysdate() -> 2015-12-09 17:47:56
oracle.dbtimezone - サーバーのタイムゾーンを返します - orafce.timezone 経由でエミュレートされます
oracle.dbtimezone() -> GMT
oracle.sessiontimezone() - セッションのタイムゾーンを返します - 現在の PostgreSQL のタイムゾーン
oracle.sessiontimezone() -> ヨーロッパ/プラハ
oracle.sys_extract_utc(timestamp with timezone) - utc タイムゾーンのタイムスタンプを返します。
oracle.sys_extract_utc(current_timestamp)
oracle.sys_extract_utc(oracle.date) - utc タイムゾーンのタイムスタンプを返します。タイムゾーンが指定されていない場合は、セッション (現在の PostgreSQL) タイムゾーンが使用されます。
oracle.sys_extract_utc(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-24 09:21:12
oracle.to_char(timestamp) - nls_date_format でタイムスタンプを返します。
orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(to_date('14-Jan08 11:44:49+05:30')) -> 14-Jan08 11:44:49 orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(oracle.to_date('21052014 12:13:44+05:30','DDMMYYYY HH24:MI:SS')) -> 14-May21 12:13:44
oracle.+(oracle.date,smallint) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::smallint -> 2014-07-11 10:08:55
oracle.+(oracle.date,integer) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::integer -> 2014-07-11 10:08:55
oracle.+(oracle.date,bigint) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::bigint -> 2014-07-11 10:08:55
oracle.+(oracle.date,numeric) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::numeric -> 2014-07-11 10:08:55
oracle.-(oracle.date,smallint) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::smallint -> 2014-06-23 10:08:55
oracle.-(oracle.date,integer) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::integer -> 2014-06-23 10:08:55
oracle.-(oracle.date,bigint) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::bigint -> 2014-06-23 10:08:55
oracle.-(oracle.date,numeric) - oracle.date を返します。
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::numeric -> 2014-06-23 10:08:55
oracle.-(oracle.date,oracle.date) - 倍精度を返します
oracle.to_date('2014-07-17 11:10:15', 'yyyy-mm-dd hh24:mi:ss') - oracle.to_date('2014-02-01 10:00:00', 'yyyy -mm-dd hh24:mi:ss') -> 166.048785
oracle.add_months、oracle.last_day、oracle.next_day、oracle.months_between などの関数が並行してインストールされるため、search_path を oracle,"$user", public, pg_catalog に設定する必要があります。 pg_catalog.add_months、pg_catalog.last_day、pg_catalog.next_day、pg_catalog.months_between。
PostgreSQL には Oracle のテーブル「dual」は必要ありませんが、Oracle ユーザーが集中的に使用するため、orafce に追加されました。このテーブルはoracle
スキーマ内にあります。通常、無修飾アクセスを許可したいので、このスキーマをsearch_path
設定に追加する必要があります ( postgresql.conf
のsearch_path = 'oracle, pg_catalog, "$user", public'
など)。
PostgreSQL は、RAISE NOTICE 経由でクライアントに情報を送信します。 Oracle は dbms_output.put_line() を使用します。これは、RAISE NOTICE とは動作が異なります。 Oracle にはセッション キューがあり、put_line() がキューに行を追加し、関数 get_line() がキューから読み取ります。フラグ「serveroutput」が設定されている場合、クライアントはすべての SQL ステートメントでキューを読み取ります。次のものが使用できます。
dbms_output.enable() を選択します。 select dbms_output.put_line('first_line'); select dbms_output.put_line('next_line'); select * from dbms_output.get_lines(0);
または
dbms_output.enable() を選択します。 select dbms_output.serveroutput('t'); select dbms_output.put_line('first_line');
このパッケージには、enable()、disable()、serveroutput()、put()、put_line()、new_line()、get_line()、get_lines() の関数が含まれています。パッケージ キューはセッションのローカル メモリに実装されます。
このパッケージを使用すると、PL/pgSQL プログラムはサーバーからアクセス可能な任意のファイルの読み取りと書き込みを行うことができます。各セッションでは最大 10 個のファイルを開くことができ、最大行サイズは 32K です。このパッケージには次の機能が含まれています。
utl_file.fclose(file utl_file.file_type) - ファイルを閉じる
utl_file.fclose_all() - すべてのファイルを閉じる
utl_file.fcopy(src_location, src_filename, dest_location, dest_filename[, start_line][, end_line]) - テキスト ファイルをコピーします
utl_file.fflush(file utl_file.file_type) - バッファからすべてのデータをフラッシュします
utl_file.fgetattr(場所, ファイル名) - ファイル属性を取得します
utl_file.fopen(場所のテキスト, ファイル名のテキスト, ファイルモードのテキスト [, maxlinesize int] [, エンコーディング名]) utl_file.file_type - ファイルを開く
utl_file.fremove(場所, ファイル名) - ファイルを削除します
utl_file.frename(場所, ファイル名, dest_dir, dest_file[, 上書き]) - ファイルの名前を変更します
utl_file.get_line(file utl_file.file_type) text - ファイルから 1 行を読み取ります
utl_file.get_nextline(file utl_file.file_type) text - ファイルから 1 行を読み取るか、NULL を返します。
utl_file.is_open(file utl_file.file_type) bool - ファイルが開かれている場合は true を返します。
utl_file.new_line(file utl_file.file_type [,rows int]) - いくつかの改行文字をファイルに書き込みます
utl_file.put(file utl_file.file_type, バッファテキスト) - バッファをファイルに置きます
utl_file.put_line(file utl_file.file_type, バッファテキスト) - 行をファイルに書き込みます
utl_file.putf(file utl_file.file_type, フォーマット バッファ [,arg1 text][,arg2 text][..][,arg5 text]) - フォーマットされたテキストをファイルに入れます
utl_file.tmpdir() - 一時ディレクトリのパスを取得する
PostgreSQL は参照による呼び出しをサポートしていないため、fclose と get_line などの一部の関数が若干異なります。
f utl_file.file_type を宣言します。 始める f := utl_file.fopen('/tmp', 'sample.txt', 'r'); <<readl>> ループ 始める 通知を生成します '%', utl_file.get_line(f); 例外 no_data_found の場合 readl を終了します。 終わり; ループを終了します。 f := fclose(f); 終わり;
または 2 番目 (PostgreSQL 固有の関数 get_nextline を使用)
宣言する f utl_file.file_type; 行テキスト; 始める f := utl_file.fopen('/tmp', 'sample.txt', 'r'); ループ 行 := utl_file.get_nextline(f); 行が NULL の場合は終了します。 通知 '%' を発生させます、行; 例外 他の人がそのとき utl_file.fclose_all(); 終わり;
パッケージを使用する前に、utl_file.utl_file_dir テーブルを設定する必要があります。これには、終了記号 ('/' または '') のない、許可されたすべてのディレクトリが含まれます。 WinNT プラットフォームでは、パスは毎回記号 '' で終わる必要があります。
ディレクトリエントリには名前を付けることができます (テーブルutl_file.utl_file_dir
の 2 番目の列)。 location
パラメータには、ディレクトリ名または辞書パスを指定できます。場所は最初にディレクトリ名として解釈され、チェックされます。見つからない場合 (2 列目)、その場所はパスとして解釈され、チェックされます。
utl_file パッケージ (Postgres 上のスキーマ) の関数には、テーブル utl_file.utl_file_dir へのアクセスが必要です。この事実を利用して、どのユーザーがこれらの機能を使用できるかどうかを制御できます。デフォルト設定は PUBLIC の READ です。 INSERT、UPDATEは特権ユーザー(スーパーユーザー)のみ行えます。したがって、権限のないユーザーはこのパッケージの関数を使用できますが、安全なディレクトリのリスト (utl_file.utl_file_dir テーブルの内容) を変更することはできません。このテーブルの内容は PUBLIC に表示されます (または、このパッケージの関数を使用するユーザーにも表示される必要があります)。
これは、DBMS_SQL パッケージの Oracle の API の実装です。
完全な互換性は保証されませんが、移行を成功させるために必要な作業は軽減されるはずです。
注意: PostgreSQL アーキテクチャは Oracle のアーキテクチャとは異なります。 PL/pgSQLはSQLエンジンと同様に同じコンテキストで実行されます。したがって、優れたパフォーマンスを得るために、Postgres での一括収集や収集の反復などの Oracle のパターンを使用する理由はありません。このコードは、一部のアプリケーションを Oracle から Postgres に移植することに関連する作業を軽減するように設計されており、適切に機能します。ただし、組み込みの PL/pgSQL ステートメントに対してパフォーマンス上の利点はありません。 Oracle の API のエミュレーションにはメモリと CPU のオーバーヘッドがあり、より大きなデータでは重大な影響を与える可能性があります。
この拡張機能は、Oracle の dbms_sql インターフェイスのサブセットを実装します。この拡張機能の目的は Oracle との互換性ではなく、Oracle アプリケーションの Postgres への移行に関連する一部の作業を減らすことを目的としています。いくつかの基本的な一括 DML 機能がサポートされています。
$$をする 宣言する c int; int[]; b varchar[]; ca 数値[]; 始める c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'foo 値に挿入 (:a, :b, :c)'); a := ARRAY[1, 2, 3, 4, 5]; b := ARRAY['アホジ', 'ナズダル', 'バザール']; ca := ARRAY[3.14, 2.22, 3.8, 4]; call dbms_sql.bind_array(c, 'a', a, 2, 3); call dbms_sql.bind_array(c, 'b', b, 3, 4); dbms_sql.bind_array(c, 'c', ca) を呼び出します。 通知 '挿入行 %d'、dbms_sql.execute(c); 終わり; $$; $$をする 宣言する c int; int[]; b varchar[]; ca 数値[]; 始める c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'select i, ''Ahoj'' || i, i + 0.003 fromgenerate_series(1, 35) g(i)'); dbms_sql.define_array(c, 1, a, 10, 1); を呼び出します。 dbms_sql.define_array(c, 2, b, 10, 1); を呼び出します。 dbms_sql.define_array(c, 3, ca, 10, 1); を呼び出します。 dbms_sql.execute(c) を実行します。 while dbms_sql.fetch_rows(c) > 0 ループ dbms_sql.column_value(c, 1, a); を呼び出します。 dbms_sql.column_value(c, 2, b); を呼び出します。 dbms_sql.column_value(c, 3, ca); を呼び出します。 通知 'a = %', a; を発生させます。 通知 'b = %', b; を発生させます。 通知 'c = %', ca; を発生させます。 ループを終了します。 dbms_sql.close_cursor(c) を呼び出します。 終わり; $$;
プロシージャdbms_sql.describe_columns
に似た関数dbms_sql.describe_columns_f
があります。型 ID は PostgreSQL の型システムに関連していることに注意してください。値は Oracle の数値に変換されません。
$$をする 宣言する c int; r 記録; d dbms_sql.desc_rec; 始める c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'select * from pg_class'); r := dbms_sql.describe_columns(c); 通知 '%'、r.col_cnt; を生成します。 配列 r.desc_t の foreach d ループ 通知を生成します '% %'、d.col_name、d.col_type::regtype; ループを終了します。 dbms_sql.close_cursor(c) を呼び出します。 終わり; $$; $$をする 宣言する c int; n 整数; d dbms_sql.desc_rec; da dbms_sql.desc_rec[]; 始める c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'select * from pg_class'); dbms_sql.describe_columns(c, n, da) を呼び出します。 通知 '%', n; を発生させます。 配列 da の d を foreach ループ 通知を生成します '% %'、d.col_name、d.col_type::regtype; ループを終了します。 dbms_sql.close_cursor(c) を呼び出します。 終わり; $$;
このパッケージは、dbms_pipe Oracle パッケージのエミュレーションです。セッション間の通信を提供します。待機の有無にかかわらず、任意のメッセージを送信したり読んだりできます。アクティブなパイプをリストします。パイプをプライベートまたはパブリックとして設定します。そして、明示的または暗黙的なパイプを使用します。
パイプの最大数は 50 です。
共有メモリはメッセージの送信に使用されます。
以下に例を示します。
-- セッション A select dbms_pipe.create_pipe('my_pipe',10,true); -- 明示的なパイプの作成 select dbms_pipe.pack_message('neco je jinak'); select dbms_pipe.pack_message('それ以外のものは何でも'); select dbms_pipe.send_message('my_pipe',20,0); -- 制限を変更し、待たずに送信します select * from dbms_pipe.db_pipes; -- 現在のパイプのリスト -- セッション B select dbms_pipe.receive_message('my_pipe',1); -- メッセージが届くまで最大 1 秒待ちます select dbms_pipe.next_item_type(); -- -> 11、テキスト select dbms_pipe.unpack_message_text(); select dbms_pipe.next_item_type(); -- -> 11、テキスト select dbms_pipe.unpack_message_text(); select dbms_pipe.next_item_type(); -- -> 0、これ以上アイテムはありません select dbms_pipe.remove_pipe('my_pipe');
ただし、Oracle と比較するといくつかの違いがあります。
パイプの制限はバイト単位ではなくパイプ内の要素単位です
待たずにメッセージを送信できます
空のメッセージを送信できます
next_item_type は TIMESTAMP (タイプ 13) について知っています。
PostgreSQL は RAW 型を認識しないため、代わりに bytea を使用してください
プロセス間通信のもう 1 つの手段。
-- セッション A select dbms_alert.register('boo'); select * from dbms_alert.waitany(10); -- セッション B select dbms_alert.register('boo'); select * from dbms_alert.waitany(10); -- セッション C select dbms_alert.signal('boo','Nice day');
このモジュールには、パッケージ PLVdate の営業日を操作するためのいくつかの関数が含まれています。詳細なドキュメントは PLVision ライブラリにあります。このパッケージは多文化向けですが、デフォルト構成はヨーロッパ諸国のみを対象としています (ソースコードを参照)。
独自の非営業日 (最大 50 日) と独自の休日 (最大 30 日) を定義する必要があります。休日は非営業日であり、毎年同じです。たとえば、西洋諸国のクリスマスの日。
plvdate.add_bizdays(day date, days int) date - 日付に <n> 営業日を加算して作成された日付を取得します
plvdate.nearest_bizday(day date) date - ユーザー定義の、指定された日付に最も近い営業日を取得します。
plvdate.next_bizday(day date) date - ユーザー定義の指定された日付から次の営業日を取得します。
plvdate.bizdays_between(day1 date, day2 date) int - 2 つの日付の間の営業日数を取得します。
plvdate.prev_bizday(day date) date - 指定された日付から前の営業日を取得します
plvdate_isbizday(date) bool - この関数を呼び出して、日付が営業日かどうかを判断します
plvdate.set_nonbizday(dow varchar) - 曜日を休日として設定します
plvdate.unset_nonbizday(dow varchar) - 非営業日としての曜日の設定を解除します
plvdate.set_nonbizday(day date) - 休日として曜日を設定します
plvdate.unset_nonbizday(day date) - 休日として設定を解除する日
plvdate.set_nonbizday(day date,repeat bool) - 日を非営業日に設定します。「repeat」が true の場合、その日は毎年非営業になります。
plvdate.unset_nonbizday(day date,repeat bool) - 非営業日としての日の設定を解除します。「repeat」が true の場合、その日は毎年非営業日になります。
plvdate.use_easter() - 復活祭の日曜日と復活祭の月曜日は休日になります
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool - イースターを使用する場合は true を返します
plvdate.use_great_friday() - イースター グレート フライデーは休日になります
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool - イースター グレート フライデーを休日として使用する場合は true を返します
plvdate.include_start() - bizdays_between 計算に開始日を含めます
plvdate.noinclude_start();
plvdate.include_start(ブール値を含む);
plvdate.include_start() ブール値;
plvdate.default_holidays(varchar) - デフォルト設定をロードします。現時点では、チェコ、ドイツ、オーストリア、ポーランド、スロバキア、ロシア、英国、米国の構成を使用できます。
設定には、すべての地域に共通する祝日のみが含まれています。 plvdate.set_nonbizday(nonbizday, true) を使用して独自の地域の祝日を追加できます。
例:
postgres=# select plvdate.default_holidays('チェコ'); デフォルト_休日 ----------------- (1行) postgres=# select to_char(current_date, 'day'), plvdate.next_bizday(current_date), to_char(plvdate.next_bizday(current_date),'day'); to_char |次の日 | to_char ----------+---------------+---------- 土曜日 | 2006-03-13 |月曜日 (1行)
欧州以外の環境での変更:
select plvdate.unset_nonbizday('saturday'); select plvdate.unset_nonbizday('sunday'); select plvdate.set_nonbizday('friday'); select plvdate.set_nonbizday('2006-05-19', true); plvdate.unuse_easter() を選択します。
このパッケージには、いくつかの便利な文字列関数と文字関数が含まれています。各関数は正と負のオフセット、つまり文字列の末尾からのオフセットをサポートします。例えば:
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
機能のリスト:
plvstr.normalize(str text) - 文字列を正規化 - 白い文字をスペースに置き換え、スペースをスペースに置き換えます
plvstr.is_prefix(str text, prefix text, cs bool) - prefix が str の prefix の場合、true を返します。
plvstr.is_prefix(str text, prefix text) - prefix が str の prefix の場合、true を返します。
plvstr.is_prefix(str int, prefix int) - prefix が str の prefix の場合、true を返します。
plvstr.is_prefix(str bigint, prefix bigint) - prefix が str の prefix の場合、true を返します。
plvstr.substr(str text, start int, len int) - start_in から end までの部分文字列を返します。
plvstr.substr(str text, start int) - start_in から end までの部分文字列を返します。
plvstr.instr(str text, patt text, start int, nth int) - 文字列内の検索パターン
plvstr.instr(str text, patt text, start int) - 文字列内の検索パターン
plvstr.instr(str text, patt text) - 文字列内の検索パターン
plvstr.lpart(str text, div text, start int, nth int, all_if_notfound bool) - この関数を呼び出して文字列の左側の部分を返します
plvstr.lpart(str text, div text, start int, nth int) - この関数を呼び出して文字列の左側の部分を返します
plvstr.lpart(str text, div text, start int) - この関数を呼び出して文字列の左側の部分を返します
plvstr.lpart(str text, div text) - この関数を呼び出して文字列の左側の部分を返します
plvstr.rpart(str text, div text, start int, nth int, all_if_notfound bool) - この関数を呼び出して文字列の右側の部分を返します
plvstr.rpart(str text, div text, start int, nth int) - この関数を呼び出して文字列の右側の部分を返します
plvstr.rpart(str text, div text, start int) - この関数を呼び出して文字列の右側の部分を返します
plvstr.rpart(str text, div text) - この関数を呼び出して文字列の右側の部分を返します。
plvstr.lstrip(str text, substr text, num int) - この関数を呼び出して先頭から文字を削除します
plvstr.lstrip(str text, substr text) - この関数を呼び出して先頭から文字を削除します
plvstr.rstrip(str text, substr text, num int) - この関数を呼び出して末尾から文字を削除します
plvstr.rstrip(str text, substr text) - この関数を呼び出して末尾から文字を削除します
plvstr.rvrs(str text, start int, _end int) - 文字列または文字列の一部を反転します
plvstr.rvrs(str text, start int) - 文字列または文字列の一部を反転します
plvstr.rvrs(str text) - 文字列または文字列の一部を反転します
plvstr.left(str text, n int) - 最初の num_in 文字を返します。負の num_in を使用できます
plvstr.right(str text, n int) - 最後の num_in 文字を返します。負の num_ni を使用できます
plvstr.swap(str text, replace text, start int, length int) - 文字列内の部分文字列を指定された文字列に置き換えます
plvstr.swap(str text, replace text) - 文字列内の部分文字列を指定された文字列に置き換えます
plvstr.betwn(str text, start int, _end int, inclusive bool) - 開始位置と終了位置の間の部分文字列を検索します
plvstr.betwn(str text, start text, _end text, startnth int, endnth int, inclusive bool, gotoend bool) - 開始位置と終了位置の間の部分文字列を検索します
plvstr.betwn(str text, start text, _end text) - 開始位置と終了位置の間の部分文字列を検索します
plvstr.betwn(str text, start text, _end text, startnth int, endnth int) - 開始位置と終了位置の間の部分文字列を検索します
plvchr.nth(str text, n int) - この関数を呼び出して、文字列内の N 番目の文字を返します。
plvchr.first(str text) - この関数を呼び出して文字列の最初の文字を返します
plvchr.last(str text) - この関数を呼び出して文字列の最後の文字を返します
plvchr.is_blank(c int) - 空白です
plvchr.is_blank(c text) - 空白です
plvchr.is_digit(c int) - 数字です
plvchr.is_digit(c text) - 数字です
plvchr.is_quote(c int) - 引用符です
plvchr.is_quote(c text) - 引用です
plvchr.is_other(c int) - その他です
plvchr.is_other(c text) - その他です
plvchr.is_letter(c int) - 文字です
plvchr.is_letter(c text) - 文字です
plvchr.char_name(c text) - 文字の名前を VARCHAR として ASCII コードに返します。
plvchr.quoted1(str text) - 「」の間の引用符で囲まれたテキスト
plvchr.quoted2(str text) - 「"」間の引用符で囲まれたテキスト
plvchr.stripped(str text, char_in text) - 指定された文字のすべてのインスタンスの文字列を削除します
PLVsubst パッケージは、置換キーワードに基づいて文字列置換を実行します。
plvsubst.string(template_in text, vals_in text[]) - 置換キーワードのすべてのインスタンスの文字列をスキャンし、置換値リストの次の値に置き換えます。
plvsubst.string(template_in text, vals_in text[], subst_in text)
plvsubst.string(template_in テキスト、vals_in テキスト、delim_in テキスト)
plvsubst.string(template_in テキスト、vals_in テキスト、delim_in テキスト、subst_in テキスト)
plvsubst.setsubst(str text) - 置換キーワードをデフォルトの '%s' に設定します
plvsubst.subst() - 置換キーワードの取得
例:
select plvsubst.string('私の名前は %s %s です。', ARRAY['Pavel','Stěhule']); 弦 ------------------------ 私の名前はパーベル・ステューレです。 (1行) select plvsubst.string('私の名前は %s %s.', 'Pavel,Stěhule'); 弦 ------------------------ 私の名前はパーベル・ステューレです。 (1行) select plvsubst.string('私の名前は $$ $$ です。', 'Pavel|Stěhule','|','$$'); 弦 ------------------------ 私の名前はパーベル・ステューレです。 (1行)
dms_utility.format_call_stack() — コールスタックの内容を含むフォーマットされた文字列を返す
postgres=# foo2() を選択します; foo2 --------------------------------- ----- コールスタック ----- ラインオブジェクト 番号ステートメント名 1 戻り関数 foo 1 戻り関数 foo1 1 戻り関数 foo2 (1行)
このパッケージはオリジナルの PLVlex と互換性がありません。
postgres=# select * from plvlex.tokens('select * from abc join d ON x=y', true, true); 位置 |トークン |コード | クラス |区切り文字 |モッド --------+--------+------+----------+-----------+------ 0 |選択 | 527 |キーワード | | 7 | * | 42 |その他 | |自己 9 |から | 377 |キーワード | | 25 | ABC | | ID | | 20 |参加 | 418 |キーワード | | 25 | d | | ID | | 27 |に | 473 |キーワード | | 30 | × | | ID | | 31 | = | 61 |その他 | |自己 32 | y | | ID | | (10行)
警告: キーワードのコードは PostgreSQL のバージョン間で変更される可能性があります。 o plvlex.tokens(str text,skip_spaces bool,qualified_names bool) - str の字句要素のテーブルを返します。
このパッケージは、ユーザー入力を SQL インジェクションから保護します。
dbms_assert.enquote_literal(varchar) varchar - 先頭と末尾の引用符を追加し、すべての一重引用符が隣接する一重引用符とペアになっていることを確認します。
dbms_assert.enquote_name(varchar [, boolean]) varchar - 名前を二重引用符で囲みます。オプションの 2 番目のパラメーターにより、名前が確実に小数化されます。注意 - Oracle では 2 番目のパラメータは大文字です。
dbms_assert.noop(varchar) varchar - チェックを行わずに値を返します。
dbms_assert.qualified_sql_name(varchar) varchar - この関数は、入力文字列が修飾された SQL 名であることを検証します。
dbms_assert.schema_name(varchar) varchar - 入力文字列が既存のスキーマ名であることを検証する関数です。
dbms_assert.simple_sql_name(varchar) varchar - この関数は、入力文字列が単純な SQL 名であることを検証します。
dbms_assert.object_name(varchar) varchar - 入力文字列が既存の SQL オブジェクトの修飾された SQL 識別子であることを検証します。
このユニットにはいくつかのアサート関数が含まれています。
plunit.assert_true(bool [, varchar]) - 条件が true であることをアサートします。
plunit.assert_false(bool [, varchar]) - 条件が false であることをアサートします。
plunit.assert_null(anyelement [, varchar]) - 実際の値が null であることをアサートします。
plunit.assert_not_null(anyelement [, varchar]) - 実際の値が null ではないことをアサートします。
plunit.assert_equals(anyelement, anyelement [, double precision] [, varchar]) - 期待値と実際の値が等しいことをアサートします。
plunit.assert_not_equals(anyelement, anyelement [, double precision] [, varchar]) - 期待値と実際の値が等しいことをアサートします。
plunit.fail([varchar]) - Fail を使用すると、指定されたメッセージを使用してテスト プロシージャを直ちに失敗させることができます。
dbms_random.initialize(int) - シード値を使用してパッケージを初期化します。
dbms_random.normal() - 標準正規分布で乱数を返します。
dbms_random.random() - -2^31 .. 2^31 の乱数を返します。
dbms_random.seed(int)
dbms_random.seed(text) - シード値をリセットします。
dbms_random.string(opt text(1), len int) - ランダムな文字列を作成します
dbms_random.terminate() - パッケージを終了します (Pg では何も行いません)
dbms_random.value() - [0.0 - 1.0) の乱数を返します。
dbms_random.value(低倍精度、高倍精度) - [低 - 高) の乱数を返します。
このモジュールには、concat、nvl、nvl2、lnnvl、decode、greatest、least、bitand、nanvl、sinh、cosh、tanh、oracle.substr、および oracle.mod の関数の実装が含まれています。
oracle.substr(str text, start int, len int) - Oracle 互換の部分文字列
oracle.substr(str text, start int) - Oracle と互換性のある部分文字列
oracle.substr(str numeric, start numeric) - Oracle と互換性のある部分文字列
oracle.substr(str 数値, 開始数値, len 数値) - Oracle と互換性のある部分文字列
oracle.substr(str varchar, start numeric) - Oracle 互換の部分文字列
oracle.substr(str varchar, start numeric,len numeric) - Oracle 互換の部分文字列
oracle.lpad(string, length [, fill]) - Oracle 互換の lpad
oracle.rpad(string, length [, fill]) - Oracle 互換の rpad
oracle.ltrim(string text [,characters text]) - Oracle 互換の ltrim
oracle.rtrim(string text [,characters text]) - Oracle 互換の rtrim
oracle.btrim(文字列テキスト [, 文字列テキスト]) - Oracle 互換の btrim
oracle.length(string char) - Oracle と互換性のある長さ
oracle.listagg(str text [, separator text]) - 値をリストに集計します
oracle.wm_concat(str text) - 値をカンマ区切りのリストに集約します
oracle.median(float4) - 中央値を計算します
oracle.median(float8) - 中央値を計算します
oracle.to_number(text) - 文字列を数値に変換します
oracle.to_number(numeric) - 文字列を数値に変換します
oracle.to_number(numeric,numeric) - 文字列を数値に変換します
public.to_multi_byte(text) - すべてのシングルバイト文字を対応するマルチバイト文字に変換します
public.to_single_byte(text) - すべてのマルチバイト文字を対応するシングルバイト文字に変換します
oracle.greatest(anyelement, anyelement[]) - Oracle との互換性が最も高く、NULL 入力で NULL を返します。
oracle.least(anyelement, anyelement[]) - Oracle との互換性が最も低く、NULL 入力で NULL を返します。
oracle.mod(int, int) - Oracle 互換性モジュール。2 番目のパラメータがゼロの場合は、最初のパラメータを返します。
oracle.remainder(int, int) - 数値を別の数値で割った余りを返します
oracle.remainder(numeric, numeric) - 数値を別の数値で割った余りを返します。
oracle.sys_guid() - bytea -16バイトのグローバルuniq idを返します
search_pathを 'oracle、pg_catalog、 "$ user"、public' for oracle.substr、oracle.lpad、oracle.rpad、oracle.ltrim、oracle.rtrim、oracle.btrim、oracle.lengthはsideに設置する必要があるかもしれません。 -side by pg_catalog.substr、pg_catalog.lpad、pg_catalog.rpad、 pg_catalog.ltrim、pg_catalog.rtrim、pg_catalog.btrim、pg_catalog.length。
functions oracle.decode、oracle.socl.estest and oracle.leastは、これらの関数がPostgreSQLパーサーおよびアナライザー内で実装されているため、OracleがSearch_PathのPG_Catalogの前であっても、常にスキーマ名を付けなければなりません。スキーマ名がなければ、内部関数は常に使用されます。
LPADとRPADの場合、パラメーターの文字列と塗りつぶしは、CHAR、VARCHAR、TEXT、VARCHAR2、またはNVARCHAR2のタイプであることに注意してください(最後の2つはOraFce提供のタイプです)。デフォルトの塗りつぶし文字は、半幅のスペースです。同様に、Ltrim、Rtrim、およびBtrimについて。
PostgreSQL charタイプは文字セマンティクスのみをサポートするため、Oracle.lengthには文字の単位でのみ機能するという制限があります。
3つの引数を持つOracle.Substrは、Orafce.USING_SUBSTRING_ZERO_WIDTH_IN_SUBSTR変数(Oracle、Warning_Oracle、Orafce、Awaring_orafce)を設定するために依存関係に異なる結果(nullまたは空の文字列)を返すことができます。この異なる結果は、3番目の引数(substring_length)がゼロの場合にのみ返されます。デフォルトは警告_oracleです。それは、警告を発生させ、nullを返すことを意味します。
この関数は、グローバルな一意のIDを返します。 「uuid-ossp」拡張機能から指定された関数を呼び出し、この関数を使用する前にこの関数をインストールする必要があります。デフォルトでは、この関数は関数uuid_generate_v1を使用しますが、function uuid_generate_v1mc、uuid_generate_v4も使用できます(orafce.sys_guid_sourceを設定します)。 oracle.sys_guidは、builin gen_random_uuid funcも使用できます。この場合、拡張「UUID-OSSP」は必要ありません。
OrafceのVarchar2は、varchar2に関するOracleデータベースの仕様の一部を実装しています。
タイプmodifier = 'bytes'の単位(文字セマンティクスについては、nvarchar2を参照)
PostgreSQL varcharとは異なり、varchar2への暗黙のキャストは、宣言された最大長で白い空間を切り捨てません
これらのタイプはnull安全を使用することができます|| Orafce.varchar2_null_safe_concatをtrueに有効にする場合。動作はOracleに非常に似ています。
注意: - 結果が空の場合、結果はnullです。この動作はです デフォルトで無効になっています。
注意: - 3.7以降のOrafceの間には互換性があります リリースします。オペレーター機能は、安定したものとしてマークされています(以前は不変でした)。 安定した式または揮発性式で機能的なインデックスを作成することはできません。
-Null SafeConcat(デフォルトで無効) null ||を選択します「こんにちは」:: varchar2 ||ヌル; orafce.varchar2_null_safe_concatをtrueに設定します。 null ||を選択します「こんにちは」:: varchar2 ||ヌル;
PostgreSQLでは、Varchar文字列の解釈方法を動的に指定することはできないことに注意してください。データベースエンコーディングによって決定されるように、常に「文字」文字列として解釈されます。したがって、同じデータベースで特定のVarcharタイプのバイトと文字セマンティクスの両方をサポートすることはできません。 Oracleでデフォルトであるため、バイトセマンティクスを実装することを選択しました。キャラクターセマンティクスについては、デフォルトではキャラクターセマンティクスを常に実装するNVarchar2を参照してください。
上記のタイプを使用して、各文字が任意の数のバイトで構成される可能性のあるマルチバイトエンコードされた文字で構成される文字列を保存する場合は注意してください。
nvarchar2は以下を実装しています。
タイプmodifier = '文字'の単位(データベースの文字セット/エンコードを使用)
文字セマンティクスが望ましい場合は、このタイプを使用してください。
Oracleとは異なり、OrafceのVarchar2およびNvarchar2は「宣言された」サイズに4000バイトの制限を課さないことに注意してください。実際、それは約10MBのPostgreSQL varcharのそれと同じです(ただし、Varcharは理論的には1GBまでのサイズの値を保存できます)
varchar2文字列で使用するバイトベースの文字列関数
substrb(varchar2、int [、int]) - 指定されたバイト位置(1つからカウント)から始まる指定された長さ(バイト単位)のサブストリングを抽出します。 3番目の引数が指定されていない場合、文字列の端までの長さが考慮されます
strposb(varchar2、varchar2) - 特定の文字列の指定されたサブストリングの場所を返します(1つからカウント)
lengthb(varchar2) - 特定の文字列の長さ(バイト)を返します
Oracleは、nullと空の文字列の違いはありません(値がテキストとして使用される場合)。 postgresの場合、nullと空の文字列は異なる値です。簡単にするためには、(Postgresデータベースで)nullのみを使用する(空の文字列を使用しないでください)またはテキストタイプの列に空の文字列のみを使用する(およびnullを使用しない)を保証するのに適しています。両方のバリアントには、いくつかの利点と短所があります。
これは、トリガー関数で列を作ることができます。
oracle.Replace_Empty_Strings(['on' | 'true' | '警告' | 'エラー'])) oracle.Replace_Null_Strings(['on' | 'true' | '警告' | 'エラー']))
オプションの文字列引数はインジケーターとして使用されるため、これらの関数は、これらの関数内で行が変更されたときに警告(おそらくエラー)を上げる必要があります。
テーブルテストを作成します(IDシリアル、名前Varchar、姓varchar); トリガーtest_trgを作成します 挿入または更新する前 テスト中 各行ごとに 手順を実行oracle.replace_empty_strings(); テストに挿入(名前、姓)値( ''、 'stehule'); - 名前はnullに置き換えられます
oracle.user_tab_columns
oracle.user_tables
oracle.user_cons_columns
oracle.user_constraints
oracle.product_componenent_version
oracle.user_objects
oracle.dba_segments
より良いドキュメント
dbms_pipeのより良いセラル化(_sendおよび_recv関数を介して)
一時的なテーブルによる共有メモリ構造を変更する:ロックのみがshmem(ビットマップ)にあり、TMP TBLのデータ
このモジュールは、BSDライセンスの下でリリースされます。
このプロジェクトは、2008年にPavel Stehule <[email protected]>によって設立されました。
他の貢献者:
ガブリエレバルトリーニ(Gbartolini)
ジェフリー・コーエン(JCohen)
ジャイルズ・ダロルド(ダロルド)
Pavan Deolasee(Pavanvd)
Peter Eisentraut(Petere)
ビーナエマーソン(B-エマーソン)
イタガキタカキ(イタガキ)
Zdenek Kotala(Hlipa)
アミットランゴーテ(アミトラン)
heikki linnakangas(hlinnaka)
富士山
マルコ・ネンシアリーニ(ムネンシア)
ヴィナヤック・ポカレ
ギャビンシェリー(SWM)
PavelStehule(Okbob)
ラヒラ・サイード(ラヒラ)