我有一個數據泵輸出腳本,我想運行。數據庫是Oracle 11g。爲了試用它,我一直在SQLDeveloper中執行它。該腳本如下所示:Oracle datapump導出錯誤「無效的參數值」
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:在 「SYS.DBMS_SYS_ERROR」,線79
ORA-06512:在 「SYS.DBMS_DATAPUMP」,線3507
ORA-06512:在 「SYS.DBMS_DATAPUMP」,線3756
ORA-065 12:在第18行
- 00000 - 「無效參數值」
*原因:用戶指定的API參數爲錯誤類型或
值範圍。後續消息由
提供DBMS_DATAPUMP.GET_STATUS將進一步描述錯誤。
*操作:糾正不良參數並重試API。
這裏的重要部分是「ORA-06512:在18行」。這指向第一個ADD_FILE語句。在瀏覽關於數據泵的Internet Oracle文檔之後,我對於應該錯在什麼地方感到不知所措。當作業甚至沒有定義時,我也無法弄清楚如何使用DBMS_DATAPUMP.GET_STATUS
,更不用說運行了。
我試着不使用reusefile
參數,我試着與實際整數值它代表,這是1
中的SQLDeveloper運行此留下一個條目漂浮在DBA_DATAPUMP_JOBS,其中ISN更換DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
擺脫那麼簡單。工作狀態是「定義」。這可以防止我第二次運行腳本。搜索了大約一個小時後,我發現它可以用DROP TABLE "TMF"."TST TMF.ACHIMSTEST11" PURGE
刪除,但爲什麼這個作品是一個謎。
我想我應該指出,我沒有寫這個腳本,它是從Java程序中的FreeMarker模板生成的。在Java程序中,生成的腳本以OracleCallableStatement和適用於11g數據庫的方式運行。我在SQLDeveloper中擺弄它的唯一原因是試圖讓它適用於12c數據庫。不用說,該腳本在SQLDeveoper中也不適用於12c。我希望它能適用於11g。
順便提一句,我用12c數據庫運行Java時得到的錯誤與上面顯示的一樣。
如果任何人都可以看到任何實際上是錯誤的或甚至只是看起來可疑的東西,我會非常感激這個建議。
謝謝亞歷克斯,當我編寫我的腳本時,恐怕我有一些概念性的大腦褪色,這是從Java版本改編的。由於我正在使用SQLDeveloper,因此我認爲轉儲所在的目錄應位於我的計算機上。當它作爲CallableStatement運行時,它與數據庫在同一臺機器上運行。當然,當我使用SQLDeveloper運行時也是如此,因爲它是執行數據庫的數據庫,而不是我的客戶端。謝謝你讓我挺直。我會修復那部分,然後再試一次。 –
賓果!我將目錄路徑更改爲DB駐留的服務器上的適當目錄,並且它工作正常。我想我現在可以在12c的Java程序中找到錯誤的原因。這幾乎可以肯定是FreeMarker模板中需要的一個缺失的屬性值。再次感謝! –