Oracle 10gのデータベースリンクを介したメタデータのコピー
質問
ヘルプの専門家に事前に感謝します。
データベースBで作成されたプロシージャを使用して、データベースオブジェクトをデータベースAからデータベースBにコピーできるようにしたい。
2つの間にデータベースリンクを作成し、dbms_metadataのget_ddl関数を次のように調整しました。
create or replace function GetDDL
(
p_name in MetaDataPkg.t_string
p_type in MetaDataPkg.t_string
)
return MetaDataPkg.t_longstring
is
-- clob
v_clob clob;
-- array of long strings
c_SYSPrefix constant char(4) := 'SYS_';
c_doublequote constant char(1) := '"';
v_longstrings metadatapkg.t_arraylongstring;
v_schema metadatapkg.t_string;
v_fullength pls_integer := 0;
v_offset pls_integer := 0;
v_length pls_integer := 0;
begin
SELECT DISTINCT OWNER
INTO v_schema
FROM all_objects@ENTORA
where object_name = upper(p_name);
-- get DDL
v_clob := dbms_metadata.get_ddl(p_type, upper(p_name), upper(v_schema));
-- get CLOB length
v_fullength := dbms_lob.GetLength(v_clob);
for nIndex in 1..ceil(v_fullength / 32767)
loop
v_offset := v_length + 1;
v_length := least(v_fullength - (nIndex - 1) * 32767, 32767);
dbms_lob.read(v_clob, v_length, v_offset, v_longstrings(nIndex));
-- Remove table’s owner from DDL string:
v_longstrings(nIndex) := replace(
v_longstrings(nIndex),
c_doublequote || user || c_doublequote || '.',
''
);
-- Remove the following from DDL string:
-- 1) "new line" characters (chr(10))
-- 2) leading and trailing spaces
v_longstrings(nIndex) :=
ltrim(rtrim(replace(v_longstrings(nIndex), chr(10), '')));
end loop;
-- close CLOB
if (dbms_lob.isOpen(v_clob) > 0)
then
dbms_lob.close(v_clob);
end if;
return v_longstrings(1);
end GetDDL;
メタデータに通常付属しているスキーマプレフィックスを削除するため。 次のクエリを使用してデータベースリンク上でこの関数を実行すると、常にnull値が返されます。
getddl( 'TABLE'、 'TABLE1')を選択します user_tables @ ENTORAから where table_name = 'TABLE1';
getddl( 'TABLE'、 'TABLE1')を選択します dual @ ENTORAから;
t_stringはvarchar2(30)です t_longstringはvarchar2(32767)です 型t_ArrayLongStringはt_longstringのテーブルです
誰かが助けてくれれば本当に感謝しています。どうもありがとう。
解決
CREATE OR REPLACE function DEMO_FN
(object_type varchar2, table_name varchar2) return varchar2
is
v_longstrings varchar2(32223);
c_doublequote constant char(1) := '"';
begin
v_longstrings := dbms_metadata.get_ddl(object_type,table_name);
-- Remove double quotes from DDL string:
v_longstrings := replace(v_longstrings, c_doublequote || user || c_doublequote || '.','');
-- Remove the following from DDL string:
-- 1) "new line" characters (chr(10))
-- 2) leading and trailing spaces
v_longstrings := ltrim(rtrim(replace(v_longstrings, chr(10), '')));
return v_longstrings;
end;
/
この関数を実行するには、サインインしたスキーマにSELECT_CATALOG_ROLEが必要であることに注意してください。
例は
ですselect demo_fn @ db_link( 'TABLE'、 'TABLE_NAME')FROM DUAL;
他のヒント
これは正常に動作します
declare
v_ddl clob;
V_DDL_PART varchar2(4000);
begin
for I in 0 .. 50 loop
select DBMS_LOB.SUBSTR@db_link(DBMS_METADATA.GET_DDL@db_link('TABLE','MYTABLE'),(4000 * I + 1)) into V_DDL_PART from dual@db_link;
V_DDL := V_DDL || V_DDL_PART;
end loop;
end;
これは正常に動作し、小さなバグが修正されました:
declare
v_ddl clob;
V_DDL_PART varchar2(4000);
begin
for I in 0 .. 10 loop
select DBMS_LOB.SUBSTR@LINK(
DBMS_METADATA.GET_DDL@LINK('TABLE','NAME','SCHEMA'),
4000,(4000 * I + 1)) into V_DDL_PART from dual@LINK;
V_DDL := V_DDL || V_DDL_PART;
end loop;
dbms_output.put_line(v_ddl);
end;
構文が正しいことを望みますが、 v_clob:= dbms_metadata.get_ddl(。 ..)
所属していません StackOverflow