3

ヘルプの専門家に事前に感謝します。

データベース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値が返されます。

select getddl('TABLE'、'TABLE1')from user_tables @ ENTORA where table_name ='TABLE1';

dual @ ENTORAからgetddl('TABLE'、'TABLE1')を選択します。

t_stringはvarchar2(30)です。t_longstringはvarchar2(32767)であり、タイプt_ArrayLongStringはt_longstringのテーブルです。

誰か助けていただければ幸いです。どうもありがとう。

4

4 に答える 4

2
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;

于 2009-10-29T10:40:45.083 に答える
1

これは問題なく動作します

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;
于 2010-05-13T06:31:24.597 に答える
1

これは正常に動作し、小さなバグが修正されました。

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;
于 2012-09-07T15:31:25.433 に答える
-1

v_clob := dbms_metadata@ENTORA.get_ddl(...)構文が正しいことを願っていますが、代わりにすべきだと思いますv_clob := dbms_metadata.get_ddl(...)

于 2009-10-28T10:05:20.140 に答える