このトピックでは、DBMS_UTILITYパッケージの使用方法について説明します。
DBMS_UTILITYパッケージには、次のストアドプロシージャと関数が含まれます。
関数またはストアドプロシージャ | カテゴリ | 戻り値タイプ | 説明 |
| ストアドプロシージャ | 非該当 | データベーステーブルを分析します。 |
| ストアドプロシージャ | 非該当 | パーティションテーブルを分析します。 |
| ストアドプロシージャ | 非該当 | スキーマテーブルを分析します。 |
| ストアドプロシージャ | 非該当 | スペースを取り除くなどのメソッドを使用して文字列を正規化します。 |
| ストアドプロシージャ | 非該当 | 名前のコンマ区切りリストを名前のテーブルに変換します。 |
| ストアドプロシージャ | 非該当 | データベースのバージョンを取得します。 |
| ストアドプロシージャ | 非該当 | DDLステートメントを実行します。 |
| 機能 | TEXT | 現在の呼び出し履歴のフォーマットされた内容を返します。 |
| 機能 | TEXT | エラーがスローされたコールスタックのフォーマットされた内容を返します。 |
| 機能 | TEXT | エラーがスローされたコールスタックのフォーマットされた内容を返します。 |
| 機能 | NUMBER | 現在の CPU 時刻を取得します。 |
| ストアドプロシージャ | 非該当 | 指定されたオブジェクトに依存するオブジェクトを取得します。 |
| 機能 | NUMBER | ハッシュ値を計算します。 |
| ストアドプロシージャ | BINARY_INTEGER | データベース初期化パラメーター設定を取得します。 |
| 機能 | NUMBER | 現在の時間を返します。 |
| ストアドプロシージャ | 非該当 | 指定した名前をコンポーネントに解析します。 |
| ストアドプロシージャ | 非該当 | 名前のテーブルをカンマ区切りのリストに変換します。 |
DBMS_UTILITYパッケージ内のすべての関数とストアドプロシージャをサポートするOracleデータベースとは異なり、PolarDB for PostgreSQL (Compatible with Oracle) クラスタは、上記の表にリストされている関数とストアドプロシージャのみをサポートします。
下表に、DBMS_UTILITY パッケージで使用可能なパブリック変数を示します。
パブリック変数 | データ型 | 値 | 説明 |
inv_error_on_restrictions | PLS_INTEGER | 1 | INVALIDATEストアドプロシージャによって使用されます。 |
lname_array | テーブル | - | 長い名前をリストします。 |
uncl_array | テーブル | - | ユーザーと名前をリストします。 |
変数
LNAME_ARRAY
LNAME_ARRAY 変数は、完全修飾名を含む長い名前のリストを格納するために使用されます。
TYPE lname_array IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
UNCL_アレイ
UNCL_ARRAY 変数は、ユーザーと名前のリストを格納するために使用されます。
TYPE uncl_array IS TABLE OF VARCHAR2(227) INDEX BY BINARY_INTEGER;
使用量
ANALYZE_DATABASE、ANALYZE SCHEMA、およびANALYZE PART_OBJECT
ANALYZE_DATABASE() 、ANALYZE_SCHEMA() 、およびANALYZE_PART_OBJECT() ストアドプロシージャは、データベース内のテーブルに関する統計を収集するために使用されます。 ANALYZE 文を実行すると、Postgres はテーブルのデータをサンプリングし、pg_statistics システムテーブルに分布統計を記録します。
ANALYZE_DATABASE、ANALYZE_SCHEMA、および ANALYZE_PART_OBJECTは、処理されるテーブルの数が異なります。
ANALYZE_DATABASE は、現在のデータベース内のすべてのスキーマのすべてのテーブルを分析します。
ANALYZE_SCHEMA は、現在のデータベース内の指定されたスキーマのすべてのテーブルを分析します。
ANALYZE_PART_OBJECT は、単一のテーブルを分析します。
構文
ANALYZE コマンドの構文は以下のとおりです。
ANALYZE_DATABASE(method VARCHAR2 [, estimate_rows NUMBER
[, estimate_percent NUMBER [, method_opt VARCHAR2 ]]])
ANALYZE_SCHEMA(schema VARCHAR2, method VARCHAR2
[, estimate_rows NUMBER [, estimate_percent NUMBER
[, method_opt VARCHAR2 ]]])
ANALYZE_PART_OBJECT(schema VARCHAR2, object_name VARCHAR2
[, object_type CHAR [, command_type CHAR
[, command_opt VARCHAR2 [, sample_clause ]]]])
Parameters
ANALYZE_DATABASE と ANALYZE_SCHEMA
パラメーター
説明
method
methodパラメーターは、ANALYZEストアドプロシージャがpg_statisticsテーブルに入力するか、pg_statisticsテーブルからエントリを削除するかを指定します。
DELETEのメソッドを指定した場合、ANALYZEストアドプロシージャはpg_statisticsから関連する行を削除します。
COMPUTEまたはESTIMATEのメソッドを指定した場合、ANALYZEストアドプロシージャは1つ以上のテーブルを分析し、分布情報をpg_statisticsに記録します。
説明COMPUTEおよびESTIMATE法は同一です。 どちらの方法も Postgres ANALYZE 文を実行します。 他のすべてのパラメーターは検証され、その後無視されます。
estimate_rows
推定統計の基となる行の数。 ESTIMATE が指定されている場合は、estimate_rows または estimate_percent のいずれかを指定する必要があります。
このパラメーターは無視されますが、互換性のために含まれています。
estimate_percent
推定統計の基となる行の割合。 ESTIMATE が指定されている場合は、estimate_rows または estimate_percent のいずれかを指定する必要があります。
このパラメーターは無視されますが、互換性のために含まれています。
method_opt
分析するオブジェクト型。 以下の組み合わせがサポートされています。
[ FOR TABLE ] [ FOR ALL [ INDEXED ] COLUMNS ] [ SIZE n ] [ FOR ALL INDEXES ]
このパラメーターは無視されますが、互換性のために含まれています。
ANALYZE_PART_OBJECT
パラメーター
説明
schema
オブジェクトを分析するスキーマの名前。
object_name
分析するパーティション化されたオブジェクトの名前。
object_type
分析するオブジェクトのタイプ。 有効な値は、T (テーブル) および I (インデックス) です。
このパラメーターは無視されますが、互換性のために含まれています。
command_type
実行する分析関数の型。 有効な値:
E:sample_clause 句の指定された行数または行の割合に基づいて推定統計を収集します。
C:正確な統計を計算します。
V:パーティションの構造と整合性を検証します。
このパラメーターは無視されますが、互換性のために含まれています。
command_opt
command_type が C または E に設定されている場合は、以下の組み合わせがサポートされます。
[ FOR TABLE ] [ FOR ALL COLUMNS ] [ FOR ALL LOCAL INDEXES ]
command_type が V に設定され、object_type が T に設定されている場合は、CASCADE がサポートされます。
このパラメーターは無視されますが、互換性のために含まれています。
sample_clause
command_type が E に設定されている場合は、推定された統計の基になる行の数または行の割合を指定する以下の句が含まれます。
SAMPLE n { ROWS | PERCENT }
このパラメーターは無視されますが、互換性のために含まれています。
無制限
CANONICALIZEストアドプロシージャは、入力文字列を管理するための次の機能をサポートします。
文字列が二重引用符で囲まれていない場合は、文字列が有効な識別子の文字を使用していることを確認します。 そうでない場合、例外がスローされます。 文字列が二重引用符で囲まれている場合には、すべての文字が許可されます。
文字列が二重引用符で囲まれておらず、ピリオドが含まれていない場合は、すべてのアルファベット文字を大文字にし、先頭と末尾のスペースを削除します。
文字列が二重引用符で囲まれ、ピリオドが含まれていない場合は、二重引用符を取り除きます。
文字列にピリオドが含まれ、文字列の一部が二重引用符で囲まれていない場合は、文字列の各部分を大文字にし、各部分を二重引用符で囲みます。
文字列にピリオドが含まれ、文字列の一部が二重引用符で囲まれている場合には、変更されていない二重引用符で囲まれた部分 (二重引用符を含む) が返され、大文字で二重引用符で囲まれていない部分が二重引用符で囲まれて返されます。
構文
CANONICALIZE(name VARCHAR2, canon_name OUT VARCHAR2,
canon_len BINARY_INTEGER)
Parameters
パラメーター | 説明 |
name | 正規化される文字列。 |
canon_name | 正規化された文字列。 |
canon_len | 名前の最初の文字から始まる正規化されるバイト数。 |
例
CANONICALIZEストアドプロシージャを作成して、入力文字列を正規化します。
CREATE OR REPLACE PROCEDURE canonicalize ( p_name VARCHAR2, p_length BINARY_INTEGER DEFAULT 30 ) IS v_canon VARCHAR2(100); BEGIN DBMS_UTILITY.CANONICALIZE(p_name,v_canon,p_length); DBMS_OUTPUT.PUT_LINE('Canonicalized name ==>' || v_canon || '<=='); DBMS_OUTPUT.PUT_LINE('Length: ' || LENGTH(v_canon)); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE); END;
CANONICALIZEストアドプロシージャを実行します。
EXEC canonicalize('"_+142%"');
サンプル結果:
Canonicalized name ==>_+142%<== Length: 6
COMMA_TO_TABLE
構文
COMMA_TO_TABLEストアドプロシージャは、名前のカンマ区切りリストを名前のテーブルに変換します。 リストの各エントリはテーブルエントリに変更されます。 名前は有効な識別子としてフォーマットする必要があります。
COMMA_TO_TABLE(list VARCHAR2, tablen OUT BINARY_INTEGER,
tab OUT { LNAME_ARRAY | UNCL_ARRAY })
Parameters
パラメーター | 説明 |
list | タブパラメーターからの名前のコンマ区切りリスト。 |
tablen | 各ページのエントリ数。 |
タブ | リストされた名前を含むテーブル。 |
LNAME_ARRAY | DBMS_UTILITY LNAME_ARRAY。 詳細については、「LNAME_ARRAY」をご参照ください。 |
UNCL_ARRAY | DBMS_UTILITY UNCL_ARRAY。 詳細については、「UNCL_ARRAY」をご参照ください。 |
例
COMMA_TO_TABLEストアドプロシージャを作成して、名前のカンマ区切りリストを名前のテーブルに変換します。
CREATE OR REPLACE PROCEDURE comma_to_table ( p_list VARCHAR2 ) IS r_lname DBMS_UTILITY.LNAME_ARRAY; v_length BINARY_INTEGER; BEGIN DBMS_UTILITY.COMMA_TO_TABLE(p_list,v_length,r_lname); FOR i IN 1..v_length LOOP DBMS_OUTPUT.PUT_LINE(r_lname(i)); END LOOP; END;
COMMA_TO_TABLEストアドプロシージャを実行します。
EXEC comma_to_table('polardb.dept, polardb.emp, polardb.jobhist');
サンプル結果:
polardb.dept polardb.emp polardb.jobhist
DB_バージョン
構文
DB_VERSIONストアドプロシージャは、データベースのバージョン番号を返します。
DB_VERSION(version OUT VARCHAR2, compatibility OUT VARCHAR2)
Parameters
パラメーター | 説明 |
version | インスタンスのエンジンバージョン。 |
compatibility | データベースの互換性。 意味は実装によって定義されます。 |
例
次の匿名ブロックを実行して、データベースのバージョンを表示します。
DECLARE
v_version VARCHAR2(150);
v_compat VARCHAR2(150);
BEGIN
DBMS_UTILITY.DB_VERSION(v_version,v_compat);
DBMS_OUTPUT.PUT_LINE('Version: ' || v_version);
DBMS_OUTPUT.PUT_LINE('Compatibility: ' || v_compat);
END;
サンプル結果:
Version: PostgreSQL 11.15 (POLARDB Database Compatible with Oracle 11.15.25)
Compatibility: PostgreSQL 11.15 (POLARDB Database Compatible with Oracle 11.15.25)
EXEC_DDL_ステートメント
構文
EXEC_DDL_STATEMENTストアドプロシージャは、DDLステートメントの実行に使用されます。
EXEC_DDL_STATEMENT(parse_string VARCHAR2)
Parameters
パラメーター | 説明 |
parse_string | 実行されるDDLステートメント。 |
例
次の匿名ブロックを実行してジョブを作成します。
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT(
'CREATE TABLE job (' ||
'jobno NUMBER(3),' ||
'jname VARCHAR2(9))'
);
END;
parse_stringに有効なDDLステートメントが含まれていない場合、PolarDB for PostgreSQL (Oracleと互換) クラスターで次のエラーメッセージが返されます。
EXEC dbms_utility.exec_ddl_statement('select rownum from dual');
ERROR: 'parse_string' must be a valid DDL statement
である必要があります
PolarDB for PostgreSQL (Compatible with Oracle) クラスタとは異なり、Oracleデータベースはエラーを生成せずに無効なparse_stringを受け入れます。
FORMAT_CALL_STACK
構文
FORMAT_CALL_STACK関数は、現在のコールスタックのフォーマットされた内容を返します。
DBMS_UTILITY.FORMAT_CALL_STACK return TEXT
この関数をストアドプロシージャ、関数、またはパッケージで使用して、現在の呼び出し履歴を読み取り可能な形式で返すことができます。
FORMAT_ERROR_バックトレース
構文
FORMAT_ERROR_BACKTRACE関数は、エラーがスローされたコールスタックのフォーマットされた内容を返します。
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE return TEXT
この関数は、ストアドプロシージャ、関数、またはパッケージで使用して、読み取り可能な形式でエラーがスローされた呼び出しスタックを返すことができます。
FORMAT_ERROR_STACK
構文
FORMAT_ERROR_STACK関数は、エラーがスローされたコールスタックのフォーマットされた内容を返します。
DBMS_UTILITY.FORMAT_ERROR_STACK return TEXT
この関数は、ストアドプロシージャ、関数、またはパッケージで使用して、読み取り可能な形式でエラーがスローされた呼び出しスタックを返すことができます。
PolarDB for PostgreSQL (Compatible with Oracle) クラスタは、Oracleデータベースとは異なるFORMAT_ERROR_STACK関数を使用します。 Oracleデータベースでは、FORMAT_ERROR_STACK関数から返される文字列にSQLCODEおよびSQLERRM情報が含まれています。 PolarDB for PostgreSQL (Compatible with Oracle) クラスターでは、FORMAT_ERROR_STACK関数はFORMAT_ERROR_BACKTRACE関数と同じように動作します。
GET_CPU_TIME
構文
GET_CPU_TIME関数は、任意の時点から100分の1秒単位でCPU時間を返します。
Parameters
パラメーター | 説明 |
cputime | CPU 時間の 100 分の 1 秒の数。 |
例
次のステートメントを実行して、CPU時間を100分の1秒単位で取得します。
SELECT DBMS_UTILITY.GET_CPU_TIME FROM DUAL;
次の結果が返されます。これは、100分の6.03秒または0.0603秒です。
get_cpu_time
--------------
603
GET_依存性
構文
GET_DEPENDENCYストアドプロシージャは、指定されたオブジェクトに依存するオブジェクトをリストするために使用されます。 GET_DEPENDENCYは、関数またはストアドプロシージャの依存関係を示しません。
GET_DEPENDENCY(type VARCHAR2, schema VARCHAR2,
name VARCHAR2)
Parameters
パラメーター | 説明 |
type | 名前オブジェクトの型。 有効な値: INDEX、PACKAGE、PACKAGE BODY、SEQUENCE、TABLE、TRIGGER、TYPE、および VIEW。 |
schema | 名前オブジェクトが存在するスキーマの名前。 |
name | 依存関係を取得するオブジェクトの名前。 |
例
次の匿名ブロックを実行して、EMPテーブルの依存関係を取得します。
BEGIN
DBMS_UTILITY.GET_DEPENDENCY('TABLE','public','EMP');
END;
サンプル結果:
DEPENDENCIES ON public.EMP
------------------------------------------------------------------
*TABLE public.EMP()
* CONSTRAINT c public.emp()
* CONSTRAINT f public.emp()
* CONSTRAINT p public.emp()
* TYPE public.emp()
* CONSTRAINT c public.emp()
* CONSTRAINT f public.jobhist()
* VIEW .empname_view()
GET_HASH_値
構文
GET_HASH_VALUE関数はハッシュ値を計算します。
hash NUMBER GET_HASH_VALUE(name VARCHAR2, base NUMBER,
hash_size NUMBER)
Parameters
パラメーター | 説明 |
name | ハッシュ値が計算される文字列。 |
base | ハッシュ値が生成される元の値。 |
hash_size | ハッシュ値の最大数。 |
hash | ハッシュ値。 |
例
次の匿名ブロックを実行して、empテーブルのename列に基づいて100から始まる最大1024ハッシュ値を含むハッシュ値テーブルを作成します。
DECLARE
v_hash NUMBER;
TYPE hash_tab IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
r_hash HASH_TAB;
CURSOR emp_cur IS SELECT ename FROM emp;
BEGIN
FOR r_emp IN emp_cur LOOP
r_hash(r_emp.ename) :=
DBMS_UTILITY.GET_HASH_VALUE(r_emp.ename,100,1024);
END LOOP;
FOR r_emp IN emp_cur LOOP
DBMS_OUTPUT.PUT_LINE(RPAD(r_emp.ename,10) || ' ' ||
r_hash(r_emp.ename));
END LOOP;
END;
サンプル結果:
SMITH 377
ALLEN 740
WARD 718
JONES 131
MARTIN 176
BLAKE 568
CLARK 621
SCOTT 1097
KING 235
TURNER 850
ADAMS 156
JAMES 942
FORD 775
MILLER 148
GET_PARAMETER_VALUE
構文
GET_PARAMETER_VALUEストアドプロシージャは、データベース初期化パラメータ設定を取得するために使用されます。
status BINARY_INTEGER GET_PARAMETER_VALUE(parnam VARCHAR2,
intval OUT INTEGER, strval OUT VARCHAR2)
Parameters
パラメーター | 説明 |
parnam | 値が返されるパラメーターの名前。 パラメーターは pg_settings システムビューにリストされます。 |
intval | 整数パラメーターの値または strval パラメーターの長さ。 |
strval | 文字列パラメーターの値。 |
status | パラメーター値が INTEGER または BOOLEAN の場合には、0 を返します。 パラメーター値が文字列の場合は、1 を返します。 |
例
次の匿名ブロックを実行して、初期化パラメーターの値を表示します。
DECLARE
v_intval INTEGER;
v_strval VARCHAR2(80);
BEGIN
DBMS_UTILITY.GET_PARAMETER_VALUE('client_encoding', v_intval, v_strval);
DBMS_OUTPUT.PUT_LINE('client_encoding' || ': ' || v_strval);
END;
サンプル結果:
client_encoding: UTF8
GET_TIME
構文
GET_TIME関数は、現在の時間を100分の1秒で返すために使用されます。
Parameters
パラメーター | 説明 |
time | プログラムが開始されてから経過した 100 分の 1 秒の数。 |
例
以下の例は、GET_TIME 関数の呼び出しを示しています。
SELECT DBMS_UTILITY.GET_TIME FROM DUAL;
サンプル結果:
get_time
----------
1555860
NAME_TOKENIZE
構文
NAME_TOKENIZEストアドプロシージャは、名前をそのコンポーネントに解析します。 二重引用符で囲まれていない名前は大文字になります。 二重引用符は、二重引用符の付いた名前から削除されます。
NAME_TOKENIZE(name VARCHAR2, a OUT VARCHAR2, b OUT VARCHAR2,c OUT VARCHAR2, dblink OUT VARCHAR2, nextpos OUT BINARY_INTEGER)
Parameters
パラメーター | 説明 |
name | 次の形式の名前を含む文字列。
|
a | 左端のコンポーネントを返します。 |
b | コンポーネントが存在する場合は、2 番目のコンポーネントを返します。 |
c | コンポーネントが存在する場合は、3 番目のコンポーネントを返します。 |
dblink | データベースリンク名を返します。 |
nextpos | 名前で解析された最後の文字の位置。 |
例
異なる名前をコンポーネントに解析するためのNAME_TOKENIZEストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE name_tokenize (
p_name VARCHAR2
)
IS
v_a VARCHAR2(30);
v_b VARCHAR2(30);
v_c VARCHAR2(30);
v_dblink VARCHAR2(30);
v_nextpos BINARY_INTEGER;
BEGIN
DBMS_UTILITY.NAME_TOKENIZE(p_name,v_a,v_b,v_c,v_dblink,v_nextpos);
DBMS_OUTPUT.PUT_LINE('name : ' || p_name);
DBMS_OUTPUT.PUT_LINE('a : ' || v_a);
DBMS_OUTPUT.PUT_LINE('b : ' || v_b);
DBMS_OUTPUT.PUT_LINE('c : ' || v_c);
DBMS_OUTPUT.PUT_LINE('dblink : ' || v_dblink);
DBMS_OUTPUT.PUT_LINE('nextpos: ' || v_nextpos);
END;
empに設定されているnameパラメーターをトークン化します。
BEGIN name_tokenize('emp'); END;
サンプル結果:
name : emp a : EMP b : c : dblink : nextpos: 3
edb.list_empに設定されているnameパラメーターをトークン化します。
BEGIN name_tokenize('polardb.list_emp'); END;
サンプル結果:
name : polardb.list_emp a : polardb b : LIST_EMP c : dblink : nextpos: 16
"polardb" に設定されているnameパラメーターをトークン化します。"Emp_Admin ".update_emp_sal:
BEGIN name_tokenize('"polardb"."Emp_Admin".update_emp_sal'); END;
サンプル結果:
name : "polardb"."Emp_Admin".update_emp_sal a : polardb b : Emp_Admin c : UPDATE_EMP_SAL dblink : nextpos: 36
polardb.emp @ polardb_dblinkに設定されているnameパラメーターをトークン化します。
BEGIN name_tokenize('polardb.emp@polardb_dblink'); END;
サンプル結果:
name : polardb.emp@polardb_dblink a : polardb b : EMP c : dblink : polardb_DBLINK nextpos: 26
TABLE_TO_COMMA
構文
TABLE_TO_COMMAストアドプロシージャは、名前のテーブルを名前のカンマ区切りリストに変換します。 各テーブルエントリはリストエントリに変更されます。 名前は有効な識別子としてフォーマットする必要があります。
TABLE_TO_COMMA(tab { LNAME_ARRAY | UNCL_ARRAY },
tablen OUT BINARY_INTEGER, list OUT VARCHAR2)
Parameters
パラメーター | 説明 |
tab | 名前を含むテーブル。 |
LNAME_ARRAY | DBMS_UTILITY LNAME_ARRAY。 詳細については、「LNAME_ARRAY」をご参照ください。 |
UNCL_ARRAY | DBMS_UTILITY UNCL_ARRAY。 詳細については、「UNCL_ARRAY」をご参照ください。 |
tablen | リスト内のエントリの数。 |
list | タブパラメーターで指定された名前のコンマ区切りリスト。 |
例
COMMA_TO_TABLEストアドプロシージャを作成してカンマ区切りリストをテーブルに変換し、テーブルをカンマ区切りリストに変換するTABLE_TO_COMMAストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE table_to_comma ( p_list VARCHAR2 ) IS r_lname DBMS_UTILITY.LNAME_ARRAY; v_length BINARY_INTEGER; v_listlen BINARY_INTEGER; v_list VARCHAR2(80); BEGIN DBMS_UTILITY.COMMA_TO_TABLE(p_list,v_length,r_lname); DBMS_OUTPUT.PUT_LINE('Table Entries'); DBMS_OUTPUT.PUT_LINE('-------------'); FOR i IN 1..v_length LOOP DBMS_OUTPUT.PUT_LINE(r_lname(i)); END LOOP; DBMS_OUTPUT.PUT_LINE('-------------'); DBMS_UTILITY.TABLE_TO_COMMA(r_lname,v_listlen,v_list); DBMS_OUTPUT.PUT_LINE('Comma-Delimited List: ' || v_list); END;
COMMA_TO_TABLEストアドプロシージャを実行します。
EXEC table_to_comma('polardb.dept, polardb.emp, polardb.jobhist');
サンプル結果:
Table Entries ------------- polardb.dept polardb.emp polardb.jobhist ------------- Comma-Delimited List: polardb.dept, polardb.emp, polardb.jobhist