create or replace procedure EXP_SPSRC
is
  v_FileHandle UTL_FILE.FILE_TYPE;
  v_str STRING(10000);
  v_lx T_FZJBOBJ.LX%TYPE;
  
BEGIN
  -- Open the file /tmp/utl_file.txt for writing.  If the
  -- file does not exist, this will create it.  If the file
  -- does exist, this will overwrite it.  --需要在 INI<SID>.ORA 和INI.ORA 中加入一行参数:
  --UTL_FILE_DIR='d:\test'  ,其中路径d:\test根据具体需要指定,
  --可以加多个,可以用'*'
  
  v_FileHandle := UTL_FILE.FOPEN('d:\FZJB', 'EXP_FZJBOBJ.txt', 'w');
  --隐式游标c_name
  for c_name in
      (select name as myname,px,lx from T_FZJBOBJ
         where name<>'EXP_SPSRC' order by px) loop  
    IF Trim(c_name.lx) in ('FUNCTION','PACKAGE','PACKAGE BODY','PROCEDURE') THEN
     UTL_FILE.PUT_LINE(v_FileHandle, 'PROMPT/***********正在创建'||c_name.myname||'********/');         
     UTL_FILE.PUT_LINE(v_FileHandle, 'CREATE OR REPLACE ');
  --隐式游标c_src
     for c_src in (select text from user_source 
                   where trim(name)=trim(c_name.myname) and trim(type)=trim(c_name.LX) order by line) loop
        UTL_FILE.PUT_LINE(v_FileHandle, c_src.TEXT);  
     end loop;
  
     UTL_FILE.PUT_LINE(v_FileHandle, '/');
     UTL_FILE.PUT_LINE(v_FileHandle, 'PROMPT/***********创建完成'||c_name.myname||'********/');
     --UTL_FILE.FCLOSE(v_FileHandle);
    
     ----------------------------------------------------------------------------------------
     
    ELSE
     UTL_FILE.PUT_LINE(v_FileHandle, 'PROMPT/***********正在创建'||c_name.myname||'********/');         
     UTL_FILE.PUT_LINE(v_FileHandle, 'CREATE OR REPLACE VIEW  '||c_name.myname||' AS ');
     SELECT text INTO v_str FROM USER_VIEWS where view_NAME=c_name.myname;
     UTL_FILE.PUT_LINE(v_FileHandle, v_str);      
     UTL_FILE.PUT_LINE(v_FileHandle, '/');
     UTL_FILE.PUT_LINE(v_FileHandle, 'PROMPT/***********创建完成'||c_name.myname||'********/');
     
    END IF;
   
 END LOOP;
  UTL_FILE.FCLOSE(v_FileHandle);
 exception
     when others then
     rollback;
     RAISE;
END;
------------------------------------------------------------------------------------------
 

解决方案 »

  1.   

    T_FZJBOBJ是自己建的表,里面放了所有需要导的东东,比如过程,函数,包
      

  2.   

    select text from user_source where name= Proc_name and type = 'PROCEDURE' order by line;
      

  3.   

    SQL> desc user_source;
     名称                                      空?      类型
     ----------------------------------------- -------- --------------- NAME                                               VARCHAR2(30)
     TYPE                                               VARCHAR2(12)
     LINE                                               NUMBER
     TEXT                                               VARCHAR2(4000)
    是不是函数和存储过程最长是4000呢?