Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle数据泵导出错误“;无效参数值";_Java_Oracle11g_Datapump - Fatal编程技术网

Java Oracle数据泵导出错误“;无效参数值";

Java Oracle数据泵导出错误“;无效参数值";,java,oracle11g,datapump,Java,Oracle11g,Datapump,我有一个数据泵导出脚本,我想运行它。数据库是oracle11g。为了试用,我一直在SQLDeveloper中执行它。脚本如下所示: DECLARE JOBHANDLE NUMBER; STATUS VARCHAR2(20); LOGFILE UTL_FILE.FILE_TYPE; LINE VARCHAR2(200); ROW NUMBER := 1; TYPE OUTP

我有一个数据泵导出脚本,我想运行它。数据库是oracle11g。为了试用,我一直在SQLDeveloper中执行它。脚本如下所示:

DECLARE  
     JOBHANDLE   NUMBER;
     STATUS      VARCHAR2(20);
     LOGFILE     UTL_FILE.FILE_TYPE; 
     LINE        VARCHAR2(200); 
     ROW         NUMBER := 1; 
 
     TYPE OUTPUT_TYPE IS TABLE OF VARCHAR2(128) INDEX BY PLS_INTEGER;
     OUTPUT      OUTPUT_TYPE;
 BEGIN
     EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY "TESTDIR11" AS ''/home/achim/temp/0003759/T0987654321/'' ';
 
     JOBHANDLE := DBMS_DATAPUMP.OPEN(
         operation => 'EXPORT',
         job_mode  => 'TABLE',
         job_name  => 'TST TMF.ACHIMSTEST11');
  
     DBMS_DATAPUMP.ADD_FILE(
         HANDLE    => JOBHANDLE,
         filename  => 'Q01DED3D.dmp',
         directory => 'TESTDIR11',
         filetype  => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
         ,reusefile => 1
         );
  
     DBMS_DATAPUMP.ADD_FILE(
         HANDLE    => JOBHANDLE,
         filename  => 'Q01DED3D.log',
         directory => 'TESTDIR11',
         filetype  => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE
         ,reusefile => 1
         );
 
     BEGIN
         DBMS_DATAPUMP.SET_PARAMETER(
                 handle => JOBHANDLE,
                 name   => 'INCLUDE_METADATA',
                 value  => 0);
 
         DBMS_DATAPUMP.METADATA_FILTER(
                 HANDLE      => JOBHANDLE, 
                 name        => 'NAME_LIST', 
                 value       => '''ACHIMSTEST11''',
                 object_path => 'TABLE');
 
         DBMS_DATAPUMP.METADATA_FILTER(
                 HANDLE  => JOBHANDLE, 
                 name    => 'SCHEMA_LIST', 
                 value   => '''TMF''');
 
         DBMS_DATAPUMP.START_JOB(JOBHANDLE);
         DBMS_DATAPUMP.WAIT_FOR_JOB(JOBHANDLE, STATUS);
     EXCEPTION
         WHEN OTHERS 
         THEN
             status := 'ERROR'; 
     END;
 
     DBMS_DATAPUMP.DETACH(JOBHANDLE); 
 
     LOGFILE := UTL_FILE.FOPEN('TESTDIR', 'Q01DED3D.log', 'R'); 
     Loop BEGIN
         UTL_FILE.GET_LINE(LOGFILE, LINE);
         OUTPUT(ROW) := LINE; 
         ROW := ROW + 1;
     EXCEPTION 
         WHEN No_Data_Found 
         THEN 
             EXIT; 
         END;
     END Loop; 
 
     EXECUTE IMMEDIATE 'DROP DIRECTORY "TESTDIR"';
 
 END;
问题是我遇到了一个我无法解释的错误,我不知道如何找到它。错误消息是:

错误报告:

ORA-39001:参数值无效

ORA-06512:“系统数据库系统错误”,第79行

ORA-06512:“系统DBMS_数据泵”,第3507行

ORA-06512:在“系统DBMS_数据泵”第3756行

ORA-06512:第18行

  • 00000-“无效参数值”
  • *原因:用户指定的API参数类型或类型错误

    值范围。由提供的后续消息

    DBMS_DATAPUMP.GET_STATUS将进一步描述错误

    *操作:更正错误参数并重试API

    这里的重要部分是“ORA-06512:第18行”。这指向第一条ADD_FILE语句。在浏览了有关数据泵的互联网Oracle文档之后,我不知道该怎么办。我也不知道如何使用
    DBMS\u DATAPUMP.GET\u STATUS
    来定义作业,更不用说运行了

    我尝试不使用
    reusefile
    参数,并尝试用它表示的实际整数值替换
    DBMS\u DATAPUMP.KU$\u FILE\u TYPE\u DUMP\u FILE

    在SQLDeveloper中运行它会在dba_datapump_作业中留下一个浮动条目,这并不是很容易摆脱的。作业状态为“定义”。这将阻止我再次运行脚本。搜索了大约一个小时后,我发现它可以通过
    下拉表“TMF.”“TST TMF.ACHIMSTEST11”清除来删除,尽管为什么这样做是个谜

    我想我应该指出,我没有编写这个脚本,它是从Java程序中的FreeMarker模板生成的。在Java程序中,生成的脚本作为OracleCallableStatement运行,用于11g数据库。我在SQLDeveloper中摆弄它的唯一原因是试图让它在12c数据库中工作。不用说,该脚本也不适用于sqldevoper中的12c。我有点希望它能为11g工作

    顺便说一句,我在使用12c数据库运行Java时遇到的错误与上面显示的相同

    如果有人能看到任何事实上是错误的,甚至只是看起来可疑的东西,我将非常感谢你的建议

    我也不知道如何在作业还没有定义的情况下使用DBMS_DATAPUMP.GET_STATUS,更不用说运行了

    作业已定义,您在调用
    add\u file
    时已拥有句柄。因此,您可以添加一个异常处理程序来调用
    get_status
    并输出结果(当然,在执行
    set serveroutput on
    之后):

    (是的,我知道别人不好的时候,即使是重新提高,但这只是暂时的事…)

    鉴于您所展示的内容和出错的呼叫,我希望这将显示如下内容:

    ORA-39001: invalid argument value
    ORA-39000: bad dump file specification
    ORA-31641: unable to create dump file "/home/achim/temp/0003759/T0987654321/Q01DED3D.dmp"
    ORA-27040: file create error, unable to create file
    Linux-x86_64 Error: 2: No such file or directory
    Additional information: 1
    ORA-27037: unable to obtain file status
    Linux-x86_64 Error: 2: No such file or directory
    Additional information: 3
    
    当它作为可调用语句运行时,可能会为目录对象使用不同的路径。或者根本不包括create/drop,这是您在运行时通常不会做的。12c版本或者没有定义目录,或者如果它位于不同的服务器上,则使用的路径在那里无效。或者,可能是RAC,并且仅在一个节点上有效,这可能会导致错误间歇性出现

    在您所展示的内容中,
    /home/achim
    部分看起来可疑。Oracle进程所有者(通常为
    Oracle
    )必须能够读取和写入操作系统目录中的文件,并且除非您已打开主目录让全世界都能看到,否则您可能会失败,因为
    Oracle
    无法按您的要求创建转储文件

    如果是这种情况,则将目录路径更改为指向您确信
    oracle
    具有必要权限的位置;如果您有权访问该帐户,请尝试从命令行手动创建文件以进行验证。如果没有,您只需要仔细检查操作系统目录及其层次结构上的权限

    当然,您可能会看到一个不同的错误,但看起来它必须与目录或文件相关,而不是其他参数


    另外,有关删除孤立作业的信息,请参阅我的Oracle支持文档336014.1。

    谢谢你,Alex,我担心我在编写脚本时有点概念性思维淡出,该脚本改编自Java版本。因为我使用的是SQLDeveloper,所以我认为转储所在的目录应该在我的机器上。当它作为CallableStatement运行时,它与DB在同一台机器上运行。当然,当我使用SQLDeveloper运行它时,情况也是如此,因为执行的是DB,而不是我的客户机。谢谢你帮我澄清。我会修复那个部分,然后再试一次。答对了!我将目录路径更改为数据库所在的服务器上的一个适当目录,并使其正常工作。我想我现在可以在12c的Java程序中找到错误的原因了。这几乎肯定是FreeMarker模板中缺少的属性值。再次感谢!
    ORA-39001: invalid argument value
    ORA-39000: bad dump file specification
    ORA-31641: unable to create dump file "/home/achim/temp/0003759/T0987654321/Q01DED3D.dmp"
    ORA-27040: file create error, unable to create file
    Linux-x86_64 Error: 2: No such file or directory
    Additional information: 1
    ORA-27037: unable to obtain file status
    Linux-x86_64 Error: 2: No such file or directory
    Additional information: 3