Bonjour,

Je souhaite utiliser le package DBMS_DATAPUMP pour faire un export/import de tables.

Dans le cas où une table existe, je veux skipper cette table et donc la laisser telle quelle. Je sais que c'est le comportement par défaut du job d'export/import mais, si je le met dans mon script PL/SQL, ça plante...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/* Programme PLSQL utilisant DBMS_DATAPUMP pour exporter des tables d'une base vers une autre. */
 
set serveroutput on
set verify off
set feedback off
 
DECLARE
  v_n_h1 NUMBER;               -- Data Pump job handle
  v_v_status VARCHAR2(20);
 
 
BEGIN
 
-- Creation d'un job Datapump pour exporter des tables. 
  v_n_h1 := DBMS_DATAPUMP.OPEN('EXPORT','TABLE');
 
-- Ajout d'un fichier de log pour suivre la progression du traitement.
  DBMS_DATAPUMP.ADD_FILE(handle=>v_n_h1,
					filename=>'log_pump_exp_tables.log',
					directory=>'DIRPUMP', 
					filesize=>NULL,
					filetype=>DBMS_DATAPUMP.ku$_file_type_log_file,
					reusefile=>1);   
 
-- Creation d'un fichier dump file.
  DBMS_DATAPUMP.ADD_FILE(handle=>v_n_h1,filename=>'deptpump.dmp',directory=>'DIRPUMP',reusefile=>1);
 
-- Creation d'un filtre de metadonnes pour indiquer quelles tables seront exportees. 
  DBMS_DATAPUMP.METADATA_FILTER(handle=>v_n_h1,name=>'NAME_EXPR',value=>q'|in ('DEPT','EMP','EVT') |',object_path=>'TABLE');
 
-- Filtre sur les donnees de la table DEPT et EMP a exporter.
  DBMS_DATAPUMP.DATA_FILTER(v_n_h1, 'SUBQUERY', 'WHERE deptno = 10 or deptno = 20', 'DEPT', 'USER01');
  DBMS_DATAPUMP.DATA_FILTER(v_n_h1, 'SUBQUERY', 'WHERE sal > 2000', 'EMP', 'USER01');
 
    -- Si une table de la base maitre existe deja dans la base cible, la table n'est pas importée.
  dbms_output.put_line('1');
  DBMS_DATAPUMP.SET_PARAMETER(v_n_h1,'TABLE_EXISTS_ACTION','SKIP');
  dbms_output.put_line('2');
 
-- Lancement du job. 
  DBMS_DATAPUMP.START_JOB(v_n_h1);
 
  dbms_output.put_line('Job has completed');
  dbms_datapump.detach(v_n_h1);
END;
/

Résultat de l'exécution sous SQL*Plus.
On voit bien que la trace '1' est affichée mais pas la trace '2', c'est donc bien au niveau de la fonction SET_PARAMETER qu'il y a un problème.
En outre le fichier de logs est vide...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
SQL> @SQL_PUMP_EXP_TABLES.sql
1
DECLARE
*
ERROR at line 1:
ORA-39005: inconsistent arguments
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 3444
ORA-06512: at "SYS.DBMS_DATAPUMP", line 5365
ORA-06512: at line 36

Si je mets en commentaire l'appel à la procédure SET_PARAMETER, l'export est OK et voilà le contenu du fichier log.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Starting "USER01"."SYS_EXPORT_TABLE_03":
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 192 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exported "USER01"."DEPT"                             5.898 KB       2 rows
. . exported "USER01"."EMP"                              8.242 KB       6 rows
. . exported "USER01"."EVT"                              5.031 KB       3 rows
Master table "USER01"."SYS_EXPORT_TABLE_03" successfully loaded/unloaded
******************************************************************************
Dump file set for USER01.SYS_EXPORT_TABLE_03 is:
  /u01/app/oracle/oradata/DIRPUMP/deptpump.dmp
Job "USER01"."SYS_EXPORT_TABLE_03" successfully completed at 12:36:26
Est-ce que quelqu'un pourrait me dire pourquoi ça plante?

Par avance un gros merci


[RESOLU]
ca y est, j'ai trouvé, le paramètre "TABLE_EXISTS_ACTION" n'est valable que pour l'Import et pas pour l'export

http://docs.oracle.com/cd/B28359_01/...p.htm#BABEDDCF :

Table 40-23 Valid Options for the name Parameter in the SET_PARAMETER Procedure
Parameter Name Datatype Supported Operations
TABLE_EXISTS_ACTION Text Import