Заранее спасибо за помощь экспертов.
Я хочу иметь возможность копировать объекты базы данных из базы данных A в базу данных B с помощью процедуры, созданной в базе данных B.
Я создалссылка на базу данных между ними и настроили функцию get_ddl dbms_metadata, чтобы она выглядела так:
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;
, чтобы удалить префикс схемы, который обычно идет с метаданными.Я получаю нулевое значение всякий раз, когда запускаю эту функцию по ссылке на базу данных со следующими запросами.
выберите getddl ('TABLE', 'TABLE1') из user_tables @ ENTORA, где table_name = 'TABLE1';
выберите getddl ('TABLE', 'TABLE1') из двойного @ ENTORA;
t_string - это varchar2 (30)Буду очень признателен, если кто-нибудь сможет помочь.Большое спасибо.