簡體   English   中英

如何使用jdbc將包源從數據庫復制到本地計算機?

[英]how I can copy the package source from database to my local machine using jdbc?

我想使用jdbc在本地計算機中復制所有軟件包的源。

select DBMS_METADATA.GET_DDL('PACKAGE_BODY','COLLECTSTATS','MYSCHEMA') from DUAL;

我已經嘗試過但沒有得到

您可以為每個對象(包,過程,函數)使用ddl創建一個自定義表,如下所示:

drop table myobjects;
create table myobjects (obj_name varchar2(128), sub_obj_name varchar2(128), obj_type varchar2(128), obj_ddl clob);
set serveroutput on
declare
   uobj_ddl clob;
   cnt number := 1;
begin

   for dt in (select object_name, subobject_name, object_type from user_objects where object_type IN ('FUNCTION','PROCEDURE','PACKAGE')) loop
    --dbms_output.put_line(dt.object_name);
    uobj_ddl := dbms_metadata.get_ddl(upper(dt.object_type), upper(dt.object_name));
    insert into myobjects values (dt.object_name, dt.subobject_name, dt.object_type, uobj_ddl);
    if mod(cnt,100) = 0 then
       commit;
    end if;
    cnt := cnt + 1;
end loop;
commit;
end;
/

然后,您可以使用jdbc從Java上進行選擇:

select * from myobjects;

示例Java代碼:

try {
    pStat = con.prepareStatement("select * from myobjects";
    ResultSet rSet = pStat.executeQuery();
    while(rSet.next()){
        objName = rSet.getString(1);
        subObjName = rSet.getString(2);
        objType = rSet.getString(3);
        objDDL = rSet.getClob(4);
    }
    rSet = null;
} catch (SQLException e) {
    e.printStackTrace();
}
pStat = null;

問題可能與輸出大小有關。 過程或程序包的代碼大於32k,這是PL / SQL中的varchar2限制。

甚至sqlplus緩沖區也可能因大型軟件包而失敗。

一種解決方案是在游標中使用以下查詢:從user_source選擇文本,其中name ='COLLECTSTATS',按asc行排序;

這將適用於程序包,功能,過程和觸發器。 視圖的管理方式不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM