oracle数据库可否批量导出存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle数据库可否批量导出存储过程相关的知识,希望对你有一定的参考价值。

  Oracle批量导出存储过程
  法一:
  PL/SQL工具导出
  法二:
  Sql代码
  SET echo off;
  SET heading off;
  SET feedback off;
  spool C:\\Documents and Settings\\Administrator\\桌面\\proc.sql;--1、用sys用户等陆的话:
  Sql代码
  select text from dba_source where owner= \'lingfeng\' and type = \'PROCEDURE\';--2、用一般用户(要导出其下存储过程的用户):
  Sql代码
  select text from user_source;
  spool off;
  法三:(自己写存储过程导出)
  1.创建DIRECTORY
  Sql代码
  create or replace directory PROCE_DIR as \'C:/Documents and Settings/Administrator/桌面\';如创建报没权限的错误,则以system的用户登录,给当前用户赋权--赋权语句
  Sql代码
  grant create any directory to bijian;
  --撤权语句
  Sql代码
  revoke create any directory from bijian;
  创建之后可通过如下语句查询是否创建成功
  Sql代码
  select * from dba_directories;
  2.创建导出存储过程
  Sql代码
  create or replace procedure loadProce(owner varchar2)is
  type user_source_table_type is table of user_source.text%TYPE INDEX BY BINARY_INTEGER;user_source_table user_source_table_type;file_handle utl_file.file_type;
  stor_text VARCHAR2(4000);
  sql_stat varchar2(1000);
  sql_stat2 varchar2(1000);
  sql_stat3 varchar2(1000);
  nCount NUMBER;
  i NUMBER;
  begin
  sql_stat:=\'select distinct(name) from all_source where owner = \'\'\' || upper(owner) || \'\'\'\';execute immediate sql_stat bulk collect into user_source_table;file_handle:=utl_file.fopen(\'PROCE_DIR\',\'test.sql\',\'W\');for j in 1..user_source_table.count loop
  i:=1;
  sql_stat2:=\'SELECT MAX(LINE) FROM ALL_SOURCE WHERE OWNER=\'\'\' || upper(owner) || \'\'\' AND NAME=\'\'\' || user_source_table(j) || \'\'\'\';--dbms_output.put_line(sql_stat2);
  execute immediate sql_stat2 into nCount;
  WHILE i<=nCount LOOP
  sql_stat3:=\'SELECT TEXT FROM ALL_SOURCE WHERE OWNER=\'\'\' || upper(owner) || \'\'\' AND NAME=\'\'\' || user_source_table(j) || \'\'\' and line = \' || i;--dbms_output.put_line(sql_stat3);
  execute immediate sql_stat3 into stor_text;i:=i+1;
  utl_file.put(file_handle,stor_text);
  END LOOP;
  end loop;
  utl_file.fclose(file_handle);
  commit;
  end loadProce;
  3.调用,将TYPE BODY、PROCEDURE、TYPE、FUNCTION、TRIGGER、PACKAGE BODY、PACKAGE保存到桌面的test.sql中Sql代码
  begin
  loadproce(\'bijian\');
  end;
参考技术A 没有这种参数,可以考虑使用pl/sql developer工具导出

oracle expdp 可否使用网路扩充硬盘

  expdp/impdp在进行数据迁移时速度极快,通过一定的优化方法,我们让expdp和impdp跑得更加快1,parallel,在很多oracle的程序中都离不开并行操作,通过利用多core cpu的处理能力,速度增加相当明显
  例:frank用户主要有表T1,T2,T3,每个表中数据有500万行[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc.dmpreal 0m41.692s
  user 0m0.011s
  sys 0m0.032s
  [oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc.dmp parallel=3real 0m26.710s
  user 0m0.019s
  sys 0m0.007s
  速度提升相当明显,如果每个dw进程都使用单独的dmp文件会更快[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc%U.dmp parallel=3real 0m22.928s
  user 0m0.017s
  sys 0m0.008s
  一般建议parall设置不要超过cpu*2.
  2,transport_tablespace方法,直接复制表空间文件的方式。使用expdp和impdp只导出了数据字典信息.表空间要是自包含的
  SQL> exec dbms_tts.transport_set_check(\'USERS\',true);PL/SQL procedure successfully completed.
  SQL> select * from transport_set_violations;no rows selected
  transport tablespace的方法是迁移数据最快的方法。因为数据本身是不需要oracle的sql层来处理.但是表空间在expdp期间要设置成只读状态
  3,network_link模式.当数据文件比较大的时候,这时候在目标库上直接通过network_link模式在目标库上进行导入,而不需要在源库上进行expdp操作,处理方式和正常的expdp/impdmp过程类似。这样做的好处主要是可以避免了在源库上写大文件,然后还需要移动到目标库上.
  dongdongtang> grant datapump_exp_full_database to frank;Grant succeeded.
  目标库
  dongdongtang> create database link frank connect to frank identified by frank using \'frank\';Database link created.
  [oracle@localhost admin]$ impdp \\\'/ as sysdba\\\' network_link=frank schemas=franknetwork_link 定义了一个db_link名称,该过程把源端的frank schemas导入到目标库上.
  4,使用适当的方法.expdp/impdp包括了两种主要方法direct_path和external_table使用direct_path会skip掉sql layer,速度会更快,但是不能定义query[oracle@localhost ~]$ expdp frank/frank dumpfile=abc.dmp query=T1:"where a>5" access_method=direct_pathORA-39033: Data cannot be filtered under the direct path access method.
  其他的方法还有一些限制,具体可以参考mos相关文档。datapump一般会在启动的时候自动决定使用哪种方式,而且一旦决定不可以通过interactive的方式修改.可以使用400300来进行trace使用了哪种方式KUPW:02:03:30.332: 1: TABLE_DATA:"FRANK"."T1" direct path, parallel: 1KUPW:02:03:30.332: 1: In function GATHER_PARSE_ITEMSKUPW:02:03:30.332: 1: In function CHECK_FOR_REMAP_NETWORK5,对于index不会并行,对大表有索引的情况下,考虑索引以后单独 使用parallel,nologging重建。事实上在expdp的导出过程中对索引不会像表数据那样需要导出,索引只导出了ddl语句.
  6,statistics的导入可能会非常慢,特别是在10.2之前。在expdp中尽量exclude,在impdp后,使用单独的收集任务来完成.
  7,利用强大的过滤功能,主要的选项有tables,include,exclude和query。tables定义只导出某些需要的表,include表示只导出某些对像,exclude表示排除某些对像.query可以对表中数据进行过滤,只导出我们需要的那部分数据.
  8,利用压缩过功能可以减少dump文件的大小
  [oracle@localhost dpdump]$ expdp frank/frank dumpfile=abc.dmp tables=t1[oracle@localhost dpdump]$ ls -l abc.dmp
  -rw-r----- 1 oracle oinstall 1583874048 Jan 20 03:54 abc.dmp[oracle@localhost dpdump]$ expdp frank/frank dumpfile=abc.dmp tables=t1 compression=all[oracle@localhost dpdump]$ ls -l abc.dmp
  -rw-r----- 1 oracle oinstall 197234688 Jan 20 04:29 abc.dmp可以看到压缩前1.5G,压缩过后只有190M左右.
  在12c的版本中,可以通过compression_algorithm来定义压缩算法,常用的压缩级别有:basic,low,medium,high。
  结合paralell,可以非常好的利用多core cpu的处理能力.
  在11G以前的版本中也有很多的bug会导致datapump变慢的情况,可以查询相关的mos文档.datapump是使用dbms_metadata和dbms_datapump两个包来完成的,所以shared pool要保证不会太小.
参考技术A expdp 只是用来导出数据的。

以上是关于oracle数据库可否批量导出存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Oracle批量导出存储过程(保持每个存储过程独立)

Oracle怎么导出存储过程

如何导出ORACLE指定存储过程

oracle expdp 可否使用网路扩充硬盘

oracle存储过程怎样批量插入新数据

mysql存储过程怎样批量插入数据