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 :
ou exécuter chacune des requêtes en Java, et donc boucler dans un for en Java etc.....Code:
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;
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 !
