例21-1では、オブジェクトが1つしか存在しないことがわかっていたため、FETCH_CLOB
プロシージャは1回のみコールされました。scott
スキーマのすべての表などの複数のオブジェクトも取得できます。それを行うには、次の構成メンバーを使用する必要があります。
LOOP doc := DBMS_METADATA.FETCH_CLOB(h); -- -- When there are no more objects to be retrieved, FETCH_CLOB returns NULL. -- EXIT WHEN doc IS NULL; END LOOP;
例21-3に、構成メンバーの使用および複数のオブジェクトの取得を示します。この例では、ユーザーscott
として接続します。パスワードは、tiger
です。
例21-3 複数のオブジェクトの取得
次のように、my_metadata
という名前の表と、get_tables_md
という名前のプロシージャを作成します。すべてのオブジェクトを返すことはできないため、それらを表に格納して最後に問合せを実行します。
DROP TABLE my_metadata; CREATE TABLE my_metadata (md clob); CREATE OR REPLACE PROCEDURE get_tables_md IS -- Define local variables h NUMBER; -- handle returned by 'OPEN' th NUMBER; -- handle returned by 'ADD_TRANSFORM' doc CLOB; -- metadata is returned in a CLOB BEGIN -- Specify the object type. h := DBMS_METADATA.OPEN('TABLE'); -- Use filters to specify the schema. DBMS_METADATA.SET_FILTER(h,'SCHEMA','SCOTT'); -- Request that the metadata be transformed into creation DDL. th := DBMS_METADATA.ADD_TRANSFORM(h,'DDL'); -- Fetch the objects. LOOP doc := DBMS_METADATA.FETCH_CLOB(h); -- When there are no more objects to be retrieved, FETCH_CLOB returns NULL. EXIT WHEN doc IS NULL; -- Store the metadata in a table. INSERT INTO my_metadata(md) VALUES (doc); COMMIT; END LOOP; -- Release resources. DBMS_METADATA.CLOSE(h); END; /
次のようにプロシージャを実行します。
EXECUTE get_tables_md;
my_metadata
表を問い合せて、取得された内容を確認します。
SET LONG 9000000 SET PAGES 0 SELECT * FROM my_metadata;