使用数据泵导出时无法重新映射数据

Posted

技术标签:

【中文标题】使用数据泵导出时无法重新映射数据【英文标题】:Unable to remap_data while using datapump export 【发布时间】:2021-04-20 18:38:46 【问题描述】:

谁能帮助我导出数据泵。我尝试了很多组合。但是,我总是得到:

ORA-39001: invalid argument value
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4932
ORA-06512: at "SYS.DBMS_DATAPUMP", line 5768
ORA-06512: at line 38

对此有何建议?

CREATE TABLE foo
(
  bar VARCHAR2(10)
);

INSERT INTO FOO VALUES('hello');
INSERT INTO FOO VALUES('world');
COMMIT;


create or replace package pkg
 is
  function tst(p_val varchar2) return varchar2;
end pkg;
/

create or replace package body pkg
 as
function tst(p_val varchar2) return varchar2 is
begin
 return p_val;
end;
end pkg;
/



DECLARE 
  h1 NUMBER;
  l_status varchar2(200);
BEGIN

    h1 := DBMS_DATAPUMP.OPEN(
      operation => 'EXPORT', 
      job_mode => 'TABLE', 
      remote_link => NULL,
      job_name => 'exp_1', 
      version => 'LATEST'
    );

    DBMS_DATAPUMP.ADD_FILE(
      handle => h1, 
      filename => 'export.dmp', 
      reusefile => 1,
      directory => 'DBOUT',
      filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE);
      
    DBMS_DATAPUMP.ADD_FILE(
      handle => h1, 
      filename => 'export.log', 
      reusefile => 1,
      directory => 'DBOUT',
      filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE
    );

    DBMS_DATAPUMP.METADATA_FILTER(
      handle => h1,
      name => 'NAME_EXPR',
      value => 'IN (SELECT table_name FROM user_tables WHERE table_name LIKE ''FOO%'')',
      object_type => 'TABLE'
    );

    DBMS_DATAPUMP.DATA_REMAP(
      handle => h1, 
      name => 'COLUMN_FUNCTION', 
      table_name => 'FOO', 
      column => 'BAR', 
      function => 'pkg.tst'
    );

    
   DBMS_DATAPUMP.start_job(h1);
   DBMS_DATAPUMP.wait_for_job(h1, l_status);
   dbms_output.put_line( l_status );

END;
/

关于文档,它应该可以工作。没有?

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_DATAPUMP.html#GUID-2C61513F-9040-4CE3-8C22-ED1FA5FF81DD

欢迎提出任何建议,

问候,

【问题讨论】:

【参考方案1】:

FUNCTION 参数必须是正确的大小写,SCHEMA 参数必须包含并且也必须是正确的大小写。这个过程调用对我有用:

DBMS_DATAPUMP.DATA_REMAP(
  handle => h1, 
  name => 'COLUMN_FUNCTION', 
  table_name => 'FOO', 
  column => 'BAR', 
  function => 'PKG.TST',
  schema => user
);

文档中没有提到这些限制,所以我想说您的原始代码是正确的,并且这种行为是一个错误。

【讨论】:

您好 Jon Heller,令人惊讶的是,当我添加架构并将包名称和功能大写时,它起作用了。非常感谢! 我遇到了同样的问题 ORA-39001:无效的参数值 ORA-06512:在“SYS.DBMS_SYS_ERROR”,第 79 行 ORA-06512:在“SYS.DBMS_DATAPUMP”,第 4929 行 ORA- 06512:在“SYS.DBMS_DATAPUMP”的第 6378 行,我尝试了所有我能想到的组合,包括确保包名称为大写,并尝试使用和不使用模式。这是 Oracle 19。因此堆栈跟踪中的行号不同。 @GHZ 我刚刚在 Windows 上重新测试了 19c 上的代码,它对我有用。您可能需要通过 support.oracle.com 创建支持请求 - 此软件包中可能存在其他一些错误,具体取决于您的确切版本或平台。 @JonHeller 谢谢。是的,这似乎与我正在进行的 data_remap 调用的数量有关。我有几百个,即使函数在那里,它似乎总是以日志文件中缺少包函数错误(对于重映射函数)结束。当我将它减少到 10 或 20 时,它通过了。我现在回到使用 expdp 和参数文件,这很遗憾,因为我无法自动生成重映射列表。将创建一个支持请求。

以上是关于使用数据泵导出时无法重新映射数据的主要内容,如果未能解决你的问题,请参考以下文章

100天精通Oracle-实战系列(第24天)Oracle 数据泵表导出导入

100天精通Oracle-实战系列(第24天)Oracle 数据泵表导出导入

如何使用 Oracle 数据泵导出实用程序在本地计算机上创建转储文件?

在 Oracle 19c 中使用数据泵导出和导入

数据泵导的数据怎么导入其他用户

无法使用数据泵从映射的网络驱动器导入转储