質問: お世話になります。 スキーマ内の全テーブルをバックアップする処理を作成しているのですが、 題意の通り、ORA-39001 引数値が無効です のエラーを解決することができません。 1どこでエラーが発生しているのか。 2エラー解決のために、どの部分を変えればよいのか。 上記2点について、解答をよろしくお願いします。 なお、バッチからSQLファイルを呼び出して実行しております。 以下、ソース(SQLファイル)です。 ``` CREATE OR REPLACE DIRECTORY BK_DIR AS '&1'; DECLARE HANDLE NUMBER; RET_STR VARCHAR2(20); INFO CHAR; T_NAME VARCHAR2(100); BEGIN FOR INFO IN (select TABLE_NAME from USER_TABLES order by 1 desc) LOOP DBMS_OUTPUT.PUT_LINE('開始'); HANDLE:=DBMS_DATAPUMP.OPEN( 'EXPORT' ,'TABLE' ); DBMS_DATAPUMP.ADD_FILE( HANDLE ,INFO.TABLE_NAME||'.dmp' ,'BK_DIR' ,NULL ,DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE ,1); T_NAME := ''''||INFO.TABLE_NAME||''''; DBMS_DATAPUMP.METADATA_FILTER( HANDLE ,'NAME_EXPR' ,'IN('||T_NAME||')' ); DBMS_DATAPUMP.START_JOB( HANDLE ,0 ); DBMS_DATAPUMP.WAIT_FOR_JOB( HANDLE ,RET_STR ); END LOOP; / END; DROP DIRECTORY BK_DIR; EXIT; ```
回答: スクリプトが正常に動作するために修正が必要な点がいくつかあります。 (1)DBMS_DATAPUMP.ADD_FILE内 誤) ,'||INFO.TABLE_NAME||'.dmp' 正) ,INFO.TABLE_NAME||'.dmp' (2)DBMS_DATAPUMP.ADD_FILEの後 誤) TABLE_NAME := ''''||INFO.TABLE_NAME||''''; 正) T_NAME := ''''||INFO.TABLE_NAME||''''; (3)DBMS_DATAPUMP.METADATA_FILTER内 誤) ,'IN('||TABLE_NAME||')' 正) ,'IN('||T_NAME||')' (4)END LOOP;の後 誤) 正) END; 本題ですが、 > > ORA-39001 引数値が無効です > > > おそらく次の修正で改善されます。 1行目 誤) CREATE OR REPLACE DIRECTORY BACKUP_DIR AS '&1'; 正) CREATE OR REPLACE DIRECTORY BK_DIR AS '&1';