Merci moogli,
Je vais essayer dêtre clair et concis, ce qui n'est pas gagné.
Tout d'abord merci pour cette tentative d'optimisation de mon script. Cependant, les conditions ne sont pas bonnes. (trop restrictives)
Les conditions sont :
1) Si objet est de type "HF" (composant) -> si nom composant existe ET si composant dispose d'un package -> insertion en base.
2) Si objet est de type "DEVC" (package) -> si package comporte au moins une table -> insertion en base
3) Si composant comporte un package sans tables -> suppression du composant de la base
Ce script a pour but de trier une base de composants qui comporte des composants incomplets et inexploitables.
Il sert à élaborer une hiérarchie de applications/composants/packages/tables ceci afin de sélectionner des composants à anonymiser. La hiérarchie se présente sous la forme d'un menu déroulant avec des cases à cocher pour sélectionner le composant à anonymiser.
Le composants comporte un ensemble de packages et de tables qui devront (dans le futur) être récupérés ainsi que toutes les tables autres désignées par les clefs étrangères des tables des packages. Cela formera une "grappe" de tables interdépendantes qui propagera les nouvelles données issues de l'anonymisation à toutes les tables jointes entre elles par les contraintes d'intégrités. (d'ou le titre de ce thread...)
Par rapport au titre du sujet, le script PL/SQL élabore la table principale qui me servira à utiliser les composants complets. Les requêtes de clefs étrangères se feront sur un systeme SAP à l'architecture très lourde.
Au départ, le script sur lequel je bosse était rédigé en PHP et par conséquent extrèmement lourd dingue, pas du tout optimisé et me rendait la main au bout de 2min30. Aussi j'entreprends de la porter en PL/SQL pour gagner en rapidité et ressources.
Le script original en php, une usine à gaz est le suivant :
<?php
//include ($_SERVER["DOCUMENT_ROOT"].'/dao/oracle_connect.php');
if (isset($_GET["projectid"])) $ProjectID = $_POST["projectid"];
$sql0 = "BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE SAP_PACKAGES';END;";
$parsed0 = ociparse($conn,$sql0);
if(!ociexecute($parsed0)){ echo "ERROR: table drop [KO] !<br><br>";}
//=====================================================================
$sql1 = "SELECT * FROM SAP_COMPONENT_VIEW ORDER BY PACKAGE_ID ASC";
$parsed1 = ociparse($conn,$sql1);
ocidefinebyname($parsed1,'PACKAGE_ID',$ID);
ocidefinebyname($parsed1,'PACKAGE_TYPE',$TYPE);
ocidefinebyname($parsed1,'PACKAGE_NAME',$NAME);
ocidefinebyname($parsed1,'PACKAGE_LEVEL',$LEVEL);
ocidefinebyname($parsed1,'PACKAGE_PARENT_ID',$PARENT);
ocidefinebyname($parsed1,'PACKAGE_CHILD_ID',$CHILD);
ocidefinebyname($parsed1,'PACKAGE_NEXT_ID',$NEXT);
ocidefinebyname($parsed1,'PACKAGE_TEXT',$TEXT);
ociexecute($parsed1);
// inserer tout les composants non vides et les packages non vides.
$i=0;
while($line = oci_fetch_array($parsed1, OCI_ASSOC)){
$sql2 = "INSERT INTO SAP_PACKAGES (PACKAGE_ID, PACKAGE_TYPE, PACKAGE_NAME, PACKAGE_LEVEL, PACKAGE_PARENT_ID, PACKAGE_CHILD_ID, PACKAGE_NEXT_ID, PACKAGE_TEXT) VALUES ('$ID', '$TYPE', '$NAME', '$LEVEL', '$PARENT', '$CHILD', '$NEXT', '$TEXT')";
if($TYPE === "HF"){
if($CHILD !== "0"){
if(isset($NAME)){
$parsed2 = ociparse($conn,$sql2);
if(!ociexecute($parsed2)){
echo"ERROR : $i -- $ID - $PARENT - <b>[$NAME]</b> - $TEXT<br>";
break;
}
}
}
} else {
$sql3 = "SELECT TABNAME FROM SAP_INFO_TABLT WHERE DEVCLASS = '$NAME'";
$parsed3 = ociparse($conn,$sql3);
ociexecute($parsed3);
$results = oci_fetch_all($parsed3, $res);
if($results > 0){
$parsed2 = ociparse($conn,$sql2);
if(!ociexecute($parsed2)){
echo"ERROR : $i -- $ID - $PARENT - $NAME - $TEXT<br>";
break;
}
}
}
$i++;
}
echo"<br>First step of hierarchy done<br>";
// supprimer les composants vides suite a la sélection des packages vides.
$sql0 = "SELECT MAX(PACKAGE_LEVEL) FROM SAP_PACKAGES";
$parsed0 = ociparse($conn,$sql0);
ocidefinebyname($parsed0,'MAX(PACKAGE_LEVEL)',$LEVEL);
ociexecute($parsed0);
ocifetch($parsed0);
ocifreestatement($parsed0);
$i=0;
while($i<$LEVEL){
$sql10 = "SELECT PACKAGE_ID FROM SAP_PACKAGES WHERE PACKAGE_TYPE = 'HF' ORDER BY PACKAGE_ID ASC ";
$parsed10 = ociparse($conn,$sql10);
ocidefinebyname($parsed10,'PACKAGE_ID',$ID);
ociexecute($parsed10);
while($line = oci_fetch_array($parsed10, OCI_BOTH)){
$sql11 = "SELECT COUNT(*) AS NB FROM SAP_PACKAGES WHERE PACKAGE_PARENT_ID = '$ID'";
$parsed11 = ociparse($conn,$sql11);
ocidefinebyname($parsed11,'NB',$NB);
ociexecute($parsed11);
ocifetch($parsed11);
if("$NB" === "0"){
$sql12 = "DELETE FROM SAP_PACKAGES WHERE PACKAGE_ID = '$ID'";
$parsed12 = ociparse($conn,$sql12);
ociexecute($parsed12);
}
}
$i++;
}
echo "Hierarchy processus [OK]";
//include ($_SERVER["DOCUMENT_ROOT"].'/dao/oracle_disconnect.php');
?>
Oui, je sais, séchez vos larmes, j'ai honte !
Je suis tout neuf en PL/SQL et PHP. Donc, je fais du "lourd". Et il est vrai que l'insertion en base "INSERT INTO" apparait deux fois parce que... je n'ai pas su en faire une fonction !
Mon script actuel avec les conditions telles qu'elles doivent fonctionner mais qui NE COMPORTE PAS encore la 3eme condition stipulée plus haut...
Declare
V_TABNAME varchar2(30) ;
V_COUNT number ;
CURSOR C_COMP IS SELECT * FROM SAP_COMPONENT_VIEW ;
Begin
EXECUTE IMMEDIATE 'TRUNCATE TABLE SAP_PACKAGES' ;
For C in C_COMP Loop
if C.PACKAGE_TYPE = 'HF' then
if C.PACKAGE_NAME IS NOT NULL AND C.PACKAGE_CHILD_ID IS NOT NULL then
INSERT INTO SAP_PACKAGES (PACKAGE_ID, PACKAGE_TYPE, PACKAGE_NAME, PACKAGE_LEVEL, PACKAGE_PARENT_ID, PACKAGE_CHILD_ID, PACKAGE_NEXT_ID, PACKAGE_TEXT) VALUES (C.PACKAGE_ID, C.PACKAGE_TYPE, C.PACKAGE_NAME, C.PACKAGE_LEVEL, C.PACKAGE_PARENT_ID, C.PACKAGE_CHILD_ID, C.PACKAGE_NEXT_ID, C.PACKAGE_TEXT) ;
/*DBMS_OUTPUT.PUT_LINE(C.PACKAGE_ID||' '||C.PACKAGE_TYPE||' '||C.PACKAGE_NAME||' '||C.PACKAGE_LEVEL||' '||C.PACKAGE_PARENT_ID||' '||C.PACKAGE_CHILD_ID||' '||C.PACKAGE_NEXT_ID||' '||C.PACKAGE_TEXT) ;*/
end if ;
else
SELECT count(TABNAME) INTO V_COUNT FROM sap_info_tablt WHERE DEVCLASS = C.PACKAGE_NAME ;
if V_COUNT > 0 then
INSERT INTO SAP_PACKAGES (PACKAGE_ID, PACKAGE_TYPE, PACKAGE_NAME, PACKAGE_LEVEL, PACKAGE_PARENT_ID, PACKAGE_CHILD_ID, PACKAGE_NEXT_ID, PACKAGE_TEXT) VALUES (C.PACKAGE_ID, C.PACKAGE_TYPE, C.PACKAGE_NAME, C.PACKAGE_LEVEL, C.PACKAGE_PARENT_ID, C.PACKAGE_CHILD_ID, C.PACKAGE_NEXT_ID, C.PACKAGE_TEXT) ;
/*DBMS_OUTPUT.PUT_LINE(C.PACKAGE_ID||' - '||C.PACKAGE_TYPE||' - '||C.PACKAGE_NAME||' '||C.PACKAGE_LEVEL||' '||C.PACKAGE_PARENT_ID||' '||C.PACKAGE_CHILD_ID||' '||C.PACKAGE_NEXT_ID||' '||C.PACKAGE_TEXT) ;*/
end if ;
end if ;
end loop;
end;
/
Ce script doit afficher 4975 entrées.

Une fois la 3eme condition implémentée, il devrait afficher 3928 entrées.
L'interface de sélection des composants à anonymiser se présente acuellement sous cette forme :
