Bonjour,

Actuellement, je suis sur un projet où il y a plusieurs batchs. Tous ces batchs respectent la même structure de projet.

Ces batchs utilisent des requêtes SQL depuis des fichiers .properties.

Actuellement, je suis entrain de mettre en place un batch de purge. Mais j'ai des requêtes très longues (en nombre de lignes). Par souci de visibilité, j'ai placé certaines requêtes longues dans un fichier .sql que je charge lors de mon batch.

Or, on m'a dit que cela n'était pas forcement "PRO" de mettre des fichiers sql dans un jar (le batch) et qu'il serait mieux de les mettre dans un fichier xml afin de pouvoir respecter l'homogénéité des requêtes, c'est à dire ne pas avoir des requêtes dans des fichiers properties et d'autres dans des fichiers xml (ou sql).

De toute façon, je n'utiliserai pas les properties, vu que j'ai des requêtes assez longues,et donc en terme de maintenance, avoir une ligne qui fait 400 caractères (c'est pas top ) !

Qu'en pensez-vous ? .sql ou .xml ?

Et peut être que vous pourriez répondre à cette question si vous répondez à celle-ci !

Mon batch est un programme JAVA, étant donné que j'exécute des requêtes SQL, (je ne manipule aucune donnée à part insérer des paramètres à ces scripts SQL).

Est-il plus efficace de lancer un script SQL qui s'occupe de tous les traitements. Par exemple :

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
47
48
49
50
51
52
53
54
55
56
57
58
 
DECLARE
  lvl INT;
  nb INT;
BEGIN
  lvl := 0;
 
  INSERT INTO TABLE_HIERARCHIQUE (OPE_ID_FILS,OPE_ID_PERE,OPE_ID_LEVEL) (
    SELECT
      operation.ope_id,
      operation.ope_id_precedente,
      lvl
    FROM
     operation INNER JOIN type_operation
      ON operation.typ_top_id = type_operation.top_id
     LEFT OUTER JOIN apurement_incident_caisse
      ON operation.OPE_ID = apurement_incident_caisse.OPE_ID
     LEFT OUTER JOIN apurement_incident_atelier
      ON operation.OPE_ID = apurement_incident_atelier.OPE_ID
     LEFT OUTER JOIN incident_atelier_reception
      ON apurement_incident_atelier.OPE_ID_IAR = incident_atelier_reception.OPE_ID
     LEFT OUTER JOIN incident_caisse_reception
      ON apurement_incident_caisse.OPE_ID_ICR = incident_caisse_reception.OPE_ID
    WHERE
     operation.ope_date_operation > '01/01/2008'
     AND (operation.ope_num_operation <> operation.ope_code_regroupement
      OR ope_statut IN ('Annulé','Supprimé'))
     AND (TOP_IDENTIFIANT NOT IN ('INCCAEXD','INCCAEXE','INCATBED','INCATBEE'))
     AND ((incident_caisse_reception.ICR_MT_RESTANT_APURER IS NULL AND incident_atelier_reception.IAR_MT_RESTANT_APURER IS NULL)
      OR incident_caisse_reception.ICR_MT_RESTANT_APURER = 0
      OR incident_atelier_reception.IAR_MT_RESTANT_APURER = 0
     )
    );
 
    LOOP
 
      INSERT INTO TABLE_HIERARCHIQUE (OPE_ID_FILS,OPE_ID_PERE,OPE_ID_LEVEL) (
        SELECT
          operation.ope_id,
          operation.ope_id_precedente,
          lvl+1
        FROM
          TABLE_HIERARCHIQUE INNER JOIN operation
            ON TABLE_HIERARCHIQUE.OPE_ID_PERE = operation.ope_id
            AND TABLE_HIERARCHIQUE.OPE_ID_LEVEL = lvl
      );
 
      nb := SQL%ROWCOUNT;
 
      IF nb = 0 THEN
        EXIT;
      END IF;
 
      lvl := lvl + 1;
 
    END LOOP;
   INSERT INTO EXTR_ID_ARC_PUR (EXTR_ID,OPE_ID,ID_FONC,SES_ID) (SELECT S_EXTR_ID_ARC_PUR.NEXTVAL,OPERATION.OPE_ID, OPERATION.OPE_NUM_OPERATION, 5000 FROM OPERATION INNER JOIN TABLE_HIERARCHIQUE ON OPERATION.OPE_ID = TABLE_HIERARCHIQUE.OPE_ID_FILS);
END;
ou exécuter chacune des requêtes en Java, et donc boucler dans un for en Java etc.....

Ma réponse serait d'exécuter un script SQL, et ainsi éviter de faire aller/retour Java-SGBD ?

Supposons que d'exécuter le script SQL serait mieux, je pourrai tout de même récupérer ma requête par un fichier XML et lui balancer mes paramètres et lancer le script SQL. ça change rien au problème !

La seule chose est qu'il faut avoir une double compétence Java et PL/SQL en cas d'exécution du gros bloc PL/SQL ci-dessus.
Alors que si on exécute et traitement les requêtes côté Java, pas besoin de compétence PL/SQL. Mais bon, ce critère là ne me semble pas justifié vu la simplicité du code PL/SQL!

Bon en gros, quelle est votre avis sur ces deux questions ?

Merci d'avance !