DBMS_UTILITY パッケージは、以下のユーティリティプログラムをサポートしています。
関数/プロシージャ | カテゴリー | 戻り値の型 | 説明 |
---|---|---|---|
ANALYZE_DATABASE(method [, estimate_rows [, estimate_percent [, method_opt ]]]) |
プロシージャ | N/A | データベーステーブルを分析します。 |
ANALYZE_PART_OBJECT(schema, object_name [, object_type [, command_type [, command_opt
[, sample_clause ]]]]) |
プロシージャ | N/A | パーティションテーブルを分析します。 |
ANALYZE_SCHEMA(schema, method [, estimate_rows [, estimate_percent [, method_opt ]]]) |
プロシージャ | N/A | スキーマテーブルを分析します。 |
CANONICALIZE(name, canon_name OUT, canon_len) |
プロシージャ | N/A | スペース文字を削除するなどの方法を使用して、文字列を正規化します。 |
COMMA_TO_TABLE(list, tablen OUT, tab OUT) |
プロシージャ | N/A | 名前のコンマ区切りリストを名前のテーブルに変換します。 |
DB_VERSION(version OUT, compatibility OUT) |
プロシージャ | N/A | データベースのバージョンを取得します。 |
EXEC_DDL_STATEMENT(parse_string) |
プロシージャ | N/A | データ記述言語 (DDL) 文を実行します。 |
FORMAT_CALL_STACK |
関数 | TEXT | 現在の呼び出し履歴をフォーマットします。 |
GET_CPU_TIME |
関数 | NUMBER | 現在の CPU 時刻を取得します。 |
GET_DEPENDENCY(type, schema, name) |
プロシージャ | N/A | 指定されたオブジェクトに依存するオブジェクトを取得します。 |
GET_HASH_VALUE(name, base, hash_size) |
関数 | NUMBER | ハッシュ値を計算します。 |
GET_PARAMETER_VALUE(parnam, intval OUT, strval OUT) |
プロシージャ | BINARY_INTEGER | データベース初期化パラメーター設定を取得します。 |
GET_TIME |
関数 | NUMBER | 現在の時刻を返します。 |
NAME_TOKENIZE(name, a OUT, b OUT, c OUT, dblink OUT, nextpos OUT) |
プロシージャ | N/A | 指定された名前を構成要素に解析します。 |
TABLE_TO_COMMA(tab, tablen OUT, list OUT) |
プロシージャ | N/A | 名前のテーブルをカンマ区切りのリストに変換します。 |
Oracle 互換の PolarDB データベースでの DBMS_UTILITY の実装は、ネイティブ Oracle と比較すると部分的な実装です。 上表にリストされている関数とプロシージャのみがサポートされています。
下表に、DBMS_UTILITY パッケージで使用可能なパブリック変数を示します。
パブリック変数 | データ型 | 値 | 説明 |
---|---|---|---|
inv_error_on_restrictions | PLS_INTEGER | 1 | INVALIDATE プロシージャで使用されます。 |
lname_array | TABLE | - | 長い名前をリストします。 |
uncl_array | TABLE | - | ユーザーと名前をリストします。 |
LNAME_ARRAY
LNAME_ARRAY 変数は、完全修飾名を含む長い名前のリストを格納するために使用されます。
TYPE lname_array IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
UNCL_ARRAY
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 ]]]])
パラメーター
- 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 プロシージャは、入力文字列を管理する以下の機能をサポートしています。
- 文字列が二重引用符で囲まれていない場合、文字列が有効な識別子の文字を使用しているかどうかを確認します。 そうでない場合は、エラーメッセージが返されます。 文字列が二重引用符で囲まれている場合には、すべての文字が許可されます。
- 文字列が二重引用符で囲まれておらず、ピリオドが含まれていない場合は、すべてのアルファベット文字を大文字にし、先頭と末尾のスペースを削除します。
- 文字列が二重引用符で囲まれ、ピリオドが含まれていない場合は、二重引用符を削除します。
- 文字列にピリオドが含まれ、文字列の一部が二重引用符で囲まれていない場合は、文字列の各部分を大文字にし、各部分を二重引用符で囲みます。
- 文字列にピリオドが含まれ、文字列の一部が二重引用符で囲まれている場合には、変更されていない二重引用符で囲まれた部分 (二重引用符を含む) が返され、大文字で二重引用符で囲まれていない部分が二重引用符で囲まれて返されます。
CANONICALIZE(name VARCHAR2, canon_name OUT VARCHAR2,
canon_len BINARY_INTEGER)
パラメーター
パラメーター | 説明 |
---|---|
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;
EXEC canonicalize('Identifier')
Canonicalized name ==>IDENTIFIER<==
Length: 10
EXEC canonicalize('"Identifier"')
Canonicalized name ==>Identifier<==
Length: 10
EXEC canonicalize('"_+142%"')
Canonicalized name ==>_+142%<==
Length: 6
EXEC canonicalize('abc.def.ghi')
Canonicalized name ==>"ABC"." DEF"." GHI"<==
Length: 17
EXEC canonicalize('"abc.def.ghi"')
Canonicalized name ==>abc.def.ghi<==
Length: 11
EXEC canonicalize('"abc".def."ghi"')
Canonicalized name ==>"abc"." DEF"."ghi"<==
Length: 17
EXEC canonicalize('"abc.def".ghi')
Canonicalized name ==>"abc.def"." GHI"<==
Length: 15
COMMA_TO_TABLE
COMMA_TO_TABLE プロシージャを使用して、名前のカンマ区切りリストを名前のテーブルに変換することができます。 リストの各エントリはテーブルエントリに変更されます。 名前は有効な識別子としてフォーマットする必要があります。
COMMA_TO_TABLE(list VARCHAR2、tablen OUT BINARY_INTEGER、
tab OUT { LNAME_ARRAY | UNCL_ARRAY })
パラメーター
パラメーター | 説明 |
---|---|
list | タブパラメーターからの名前のコンマ区切りリスト。 |
tablen | 各ページのエントリ数。 |
tab | リストされた名前を含むテーブル。 |
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;
EXEC comma_to_table('edb.dept, edb.emp, edb.jobhist')
edb.dept
edb.emp
edb.jobhist
DB_VERSION
DB_VERSION プロシージャを使用して、データベースのバージョン番号を返すことができます。
DB_VERSION(version OUT VARCHAR2, compatibility OUT VARCHAR2)
パラメーター
パラメーター | 説明 |
---|---|
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: EnterpriseDB 10.0.0 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48), 32-bit
Compatibility: EnterpriseDB 10.0.0 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.1.220080704 (Red Hat 4.1.2-48), 32-bit
EXEC_DDL_STATEMENT
EXEC_DDL_STATEMENT プロシージャを使用して、DDL コマンドを実行することができます。
EXEC_DDL_STATEMENT(parse_string VARCHAR2)
パラメーター
パラメーター | 説明 |
---|---|
parse_string | 実行する DDL コマンド。 |
例
以下の無名ブロックは、ジョブテーブルを作成します。
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT(
'CREATE TABLE job (' ||
'jobno NUMBER(3),' ||
'jname VARCHAR2(9))'
);
END;
parse_string に有効な DDL 文が含まれていない場合には、以下のエラーメッセージが返されます。
# exec dbms_utility.exec_ddl_statement('select rownum from dual');
ERROR: EDB-20001: 'parse_string' must be a valid DDL statement
この場合、Oracle 互換の PolarDB データベースの動作は、Oracle の動作とは異なります。 Oracle は無効な parse_string をサポートしており、エラーメッセージは返されません。
FORMAT_CALL_STACK
FORMAT_CALL_STACK 関数を使用して、現在の呼び出し履歴のフォーマットされた内容を返すことができます。
DBMS_UTILITY.FORMAT_CALL_STACKreturn VARCHAR2
この関数をストアドプロシージャ、関数、またはパッケージで使用して、現在の呼び出し履歴を読み取り可能な形式で返すことができます。 この関数はデバッグに役立ちます。
GET_CPU_TIME
GET_CPU_TIME 関数を使用して、任意の時点から 100 分の 1 秒単位で CPU 時間を返すことができます。
パラメーター
パラメーター | 説明 |
---|---|
cputime | CPU 時間の 100 分の 1 秒の数。 |
例
以下の SELECT コマンドは、現在の CPU 時間 (100 分の 603 秒、つまり 0.0603 秒) を取得します。
SELECT DBMS_UTILITY.GET_CPU_TIME FROM DUAL;
get_cpu_time
--------------
603
GET_DEPENDENCY
GET_DEPENDENCY プロシージャを使用して、指定したオブジェクトに依存するオブジェクトをリストすることができます。 このプロシージャでは、関数またはプロシージャの依存関係は示されていません。
GET_DEPENDENCY(type VARCHAR2, schema VARCHAR2,
name VARCHAR2)
パラメーター
パラメーター | 説明 |
---|---|
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_VALUE
GET_HASH_VALUE 関数を使用して、指定した文字列のハッシュ値を計算することができます。
hash NUMBER GET_HASH_VALUE(name VARCHAR2, base NUMBER,
hash_size NUMBER)
パラメーター
パラメーター | 説明 |
---|---|
name | ハッシュ値が計算される文字列。 |
base | ハッシュ値が生成される元の値。 |
hash_size | 予想されるハッシュテーブルのハッシュ値の数。 |
hash | 生成されるハッシュ値。 |
例
以下の無名ブロックは、emp テーブルの ename 列を使用してハッシュ値のテーブルを作成し、ハッシュ値とともにキーを表示します。 ハッシュ値は 100 から始まり、最大 1,024 個の異なる値を含みます。
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)
パラメーター
パラメーター | 説明 |
---|---|
parnam | 値が返されるパラメーターの名前。 パラメーターは pg_settings システムビューにリストされます。 |
intval | 整数パラメーターの値または strval パラメーターの長さ。 |
strval | 文字列パラメーターの値。 |
status | パラメーター値が INTEGER または BOOLEAN の場合には、0 を返します。 パラメーター値が文字列の場合は、1 を返します。 |
例
以下の無名ブロックは、2 つの初期化パラメーターの値を示しています。
DECLARE
v_intval INTEGER;
v_strval VARCHAR2(80);
BEGIN
DBMS_UTILITY.GET_PARAMETER_VALUE('max_fsm_pages', v_intval, v_strval);
DBMS_OUTPUT.PUT_LINE('max_fsm_pages' || ': ' || v_intval);
DBMS_UTILITY.GET_PARAMETER_VALUE('client_encoding', v_intval, v_strval);
DBMS_OUTPUT.PUT_LINE('client_encoding' || ': ' || v_strval);
END;
max_fsm_pages: 72625
client_encoding: SQL_ASCII
GET_TIME
GET_TIME 関数を使用して、現在の時刻を 100 分の 1 秒単位で返すことができます。
パラメーター
パラメーター | 説明 |
---|---|
time | プログラムが開始されてから経過した 100 分の 1 秒の数。 |
例
以下の例は、GET_TIME 関数の呼び出しを示しています。
SELECT DBMS_UTILITY.GET_TIME FROM DUAL;
get_time
----------
1555860
SELECT DBMS_UTILITY.GET_TIME FROM DUAL;
get_time
----------
1556037
NAME_TOKENIZE
NAME_TOKENIZE プロシージャを使用して、名前を解析してコンポーネント部分にすることができます。 二重引用符で囲まれていない名前は大文字になります。 二重引用符は、二重引用符のある名前から削除されます。
NAME_TOKENIZE(name VARCHAR2, a OUT VARCHAR2, b OUT VARCHAR2,c OUT VARCHAR2, dblink OUT VARCHAR2, nextpos OUT BINARY_INTEGER)
パラメーター
パラメーター | 説明 |
---|---|
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 に設定された 名前パラメーターをトークン化します。
BEGIN
name_tokenize('emp');
END;
name : emp
a : EMP
b :
c :
dblink :
nextpos: 3
edb.list_emp に設定された名前パラメーターをトークン化します。
BEGIN
name_tokenize('edb.list_emp');
END;
name : edb.list_emp
a : EDB
b : LIST_EMP
c :
dblink :
nextpos: 12
"edb" に設定された名前パラメーターをトークン化します。Emp_Admin".update_emp_sal。
BEGIN
name_tokenize('"edb"." Emp_Admin".update_emp_sal');
END;
name : "edb"." Emp_Admin".update_emp_sal
a : edb
b : Emp_Admin
c : UPDATE_EMP_SAL
dblink :
nextpos: 32
edb.emp@edb_dblink に設定された名前パラメーターをトークン化します。
BEGIN
name_tokenize('edb.emp@edb_dblink');
END;
name : edb.emp@edb_dblink
a : EDB
b : EMP
c :
dblink : EDB_DBLINK
nextpos: 18
TABLE_TO_COMMA
TABLE_TO_COMMA プロシージャを使用して、名前のテーブルをカンマ区切りの名前のリストに変換することができます。 各テーブルエントリはリストエントリに変更されます。 名前は有効な識別子としてフォーマットする必要があります。
TABLE_TO_COMMA(tab { LNAME_ARRAY | UNCL_ARRAY },
tablen OUT BINARY_INTEGER, list OUT VARCHAR2)
パラメーター
パラメーター | 説明 |
---|---|
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;
EXEC table_to_comma('edb.dept, edb.emp, edb.jobhist')
Table Entries
-------------
edb.dept
edb.emp
edb.jobhist
-------------
Comma-Delimited List: edb.dept, edb.emp, edb.jobhist