Génération auto des contraintes d'intégrites dans une BDD

Eléphanteau du PHP | 20 Messages

27 sept. 2012, 19:10

La jointure sur le champs ROLLNAME n'est pas toujours fiable non plus car :
- si le champs MANDT apparait dans la table, il faut obligatoirement l'associer à la clef étrangère. Donc, il faut faire le test au préalable car ce champs ne comporte pas le même "Rollname".
- il peut y avoir 2 "rollname" différents... Dans ce cas, il faut chercher un champs de type CHAR(5), unique, qui est un format adopté spécialement pour désigner les clefs.

C'est compliqué ! :mrgreen:

Eléphanteau du PHP | 35 Messages

28 sept. 2012, 11:36

Pfiouuu ça deviens complexe ! #-o
Là comme ça j'ai un peu de mal à t'aider mais je pourrais toujours t'aider pour réfléchir à l'algo et/ou le mettre en place en PHP
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

28 sept. 2012, 13:12

Merci Guitou.

Mon souci premier est d'élaborer une table (ou plusieurs) dans laquelle je recopie toutes ces méta-données. Ensuite je prévois d'intégrer du PL/SQL (langage que je ne connais pas du tout) pour l'ajout des clefs. Mais je dois faire tout ça de telle sorte que ce soit optimisé en terme d'espace disque et de temps d'exécution... C'est fouillis pour l'instant.

Merci pour ton écoute. :)

Eléphanteau du PHP | 35 Messages

28 sept. 2012, 14:47

Je me suis abonné au fil de la discussion, donc hésite pas ;)
Désolé de pas pouvoir t'aider plus pour le moment. Mais ce n'est que partie remise !
La paresse est mère du génie.

Eléphanteau du PHP | 20 Messages

04 oct. 2012, 15:41

Bonjour,

Je reviens à la charge.
J'avance tout doux dans ma méthode et pour l'instant, je dois apprendre le PL/SQL. Aussi, je demande de l'aide ici pour faire ma première boucle dans ce langage.

Je veux afficher les lignes d'une table (SFLIGHT_DD03L) pour lesquelles, KEYFLAG et CHECKTABLE sont vides.
Object Browser.png
J'aimerai ici obtenir : TBDLS - ISPRFCDESF

Je tente ce code :
begin
for tab in (
select TABNAME from SFLIGHT_DD03L where KEYFLAG IS NULL AND CHECKTABLE IS NULL)
loop
dbms_output.put_line(tab.TABNAME||);
end loop;
end;
mais j'obtiens ce message d'erreur :
ORA-06550: Ligne 5, colonne 35 :
PLS-00103: Symbole ")" rencontré à la place d'un des symboles suivants :

( - + case mod new null
avg count
current max min prior sql stddev sum variance execute forall
merge time timestamp interval date
pipe
Quelqu'un peut m'aider ? C'est ma première boucle en PL/SQL...

Merci par avance.
David
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 oct. 2012, 11:34

Salut,


Regarde bien cette ligne

dbms_output.put_line(tab.TABNAME||);
Tu demande une concaténation (avec ||) mais y a rien derrière :)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 20 Messages

11 mars 2013, 18:43

Merci !

Désolé du délai de réponse mais j'ai du faire face à l'explosion de mon couple et il a fallu gérer...
Donc, je reviens avec ce bout de code que j'ai fait évoluer pour arriver à :
Declare
  CURSOR C_COMP Is SELECT * FROM SAP_COMPONENT_VIEW ;
Begin
  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
        DBMS_OUTPUT.PUT_LINE( C.PACKAGE_NAME || ' -> ' || C.PACKAGE_TYPE ) ;
      end if ;
    else
      SELECT TABNAME FROM sap_info_tablt WHERE DEVCLASS = C.PACKAGE_NAME ;
    DBMS_OUTPUT.PUT_LINE( TABNAME || ' -> ' || C.PACKAGE_TYPE ) ;
    end if ;
  end loop;
end;
/
Je veux faire une jointure sur un type mais j'ai un message d'erreur :

Code : Tout sélectionner

Rapport d'erreur : ORA-06550: Ligne 3, colonne 13 : PLS-00201: l'identificateur 'TABNAME.SAP_INFO_TABLT' doit être déclaré ORA-06550: Ligne 3, colonne 13 : PL/SQL: Item ignored ORA-06550: Ligne 11, colonne 27 : PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée ORA-06550: Ligne 11, colonne 37 : PL/SQL: ORA-00904: : identificateur non valide ORA-06550: Ligne 11, colonne 7 : PL/SQL: SQL Statement ignored ORA-06550: Ligne 12, colonne 27 : PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée ORA-06550: Ligne 12, colonne 5 : PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action:
Alors j'ai essayé de faire plein d etrucs mais c'est de pire en pire.
Quelqu'un aurait-il une idée ?

Merci par avance, réponse assurée dans l'heure ce coup ci.

Eléphanteau du PHP | 20 Messages

11 mars 2013, 22:01

Je me réponds :
Ca avance, mais je bloque sur le comptage des resultats
Declare
  V_DEVCLASS varchar2(30) ;
  V_TABNAME varchar2(30) ;
  V_COUNT   number(2) ;
  CURSOR C_COMP IS SELECT * FROM SAP_COMPONENT_VIEW ;
  CURSOR C_INFO IS SELECT count(TABNAME) AS V_COUNT FROM sap_info_tablt WHERE DEVCLASS = '/ATL/FORECLOSURES' ;
Begin
  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
        DBMS_OUTPUT.PUT_LINE( C.PACKAGE_NAME || ' ->  HF' ) ;
      end if ;
    else
      V_DEVCLASS := C.PACKAGE_NAME ;
      /*For I in C_INFO loop*/
        DBMS_OUTPUT.PUT_LINE( C.PACKAGE_NAME || ' is ' || C.PACKAGE_TYPE || ' and has ' || V_COUNT || 'packages' ) ;
      /*end loop ;*/
    end if ;
  end loop;
end;
/
La réponse ne comporte pas le nombre de packages :

Code : Tout sélectionner

SAP -> HF IS-CWM -> HF /CWM/APPL is DEVC and has packages /CWM/APPL_BM is DEVC and has packages /CWM/APPL_CO is DEVC and has packages /CWM/APPL_CU is DEVC and has packages /CWM/APPL_HU is DEVC and has packages /CWM/APPL_LES is DEVC and has packages /CWM/APPL_MD is DEVC and has packages /CWM/APPL_MM is DEVC and has packages /CWM/APPL_PM is DEVC and has packages /CWM/APPL_PP is DEVC and has packages /CWM/APPL_QM is DEVC and has packages /CWM/APPL_SD is DEVC and has packages /CWM/BF is DEVC and has packages /CWM/DDIC_SWITCH is DEVC and has packages /CWM/ECATT is DEVC and has packages /CWM/EHP3 is DEVC and has packages /CWM/EHP3EHP4 is DEVC and has packages /CWM/EHP3_TEST_CASES is DEVC and has packages ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 mars 2013, 22:08

CURSOR C_INFO IS SELECT count(TABNAME) AS V_COUNT FROM sap_info_tablt WHERE DEVCLASS = '/ATL/FORECLOSURES' 
pourquoi un curseur la ?

y a pas besoin
SELECT count(TABNAME) AS into V_COUNT FROM sap_info_tablt WHERE DEVCLASS = '/ATL/FORECLOSURES' ;
dans le begin

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 20 Messages

11 mars 2013, 22:20

Yes !! Merci moogli ! Ca fonctionne.
Par contre, ça traite 17644 lignes en 31 secondes, ça me parait long, je dois trouver le moyen d'optimiser un tant soit peu...

Le script donne :
Declare
  V_DEVCLASS varchar2(30) ;
  V_TABNAME varchar2(30) ;
  V_COUNT   number ;
  CURSOR C_COMP IS SELECT * FROM SAP_COMPONENT_VIEW ;
Begin
  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
        DBMS_OUTPUT.PUT_LINE( C.PACKAGE_NAME || ' ->  HF' ) ;
      end if ;
    else
      V_DEVCLASS := C.PACKAGE_NAME ;
      SELECT count(TABNAME) INTO V_COUNT FROM sap_info_tablt WHERE DEVCLASS = V_DEVCLASS ;
        DBMS_OUTPUT.PUT_LINE( C.PACKAGE_NAME || ' is ' || C.PACKAGE_TYPE || ' and has ' || V_COUNT || ' packages' ) ;
    end if ;
  end loop;
end;
/

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 mars 2013, 22:35

un
select count(*) from sap_info_tablt group by DEVCLASS 
se ne serais pas mieux nan ?
tu récupère les autre infos en même temps bien sur :)

Tu peux voir, avec explain, si c'est possible d'optimiser la chose (index par exemple).

Si tu veux bien partager les structures de tables et quelques données je pourrais faire quelques essais.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 20 Messages

11 mars 2013, 23:05

Alors si ce serait mieux, c'est à essayer mais justement, le fait de ramasser touts les champs au lieu d'un, çela ne va-t-il pas à l'encontre de l'optimisation ?

J'accepte ta proposition avec grand plaisir. Tu trouveras plus bas les deux tables à créer. Mais pour les données, j'ai deux fichiers XML à t'envoyer, ils sont gros, 6 et 3 Mo, on opère comment ?
CREATE TABLE  "SAP_COMPONENT_VIEW" 
   (	"PACKAGE_ID" NUMBER(7,0), 
	"PACKAGE_TYPE" VARCHAR2(10), 
	"PACKAGE_NAME" VARCHAR2(100), 
	"PACKAGE_LEVEL" NUMBER(10,0), 
	"PACKAGE_PARENT_ID" NUMBER(7,0), 
	"PACKAGE_CHILD_ID" NUMBER(10,0), 
	"PACKAGE_NEXT_ID" NUMBER(10,0), 
	"PACKAGE_TEXT" VARCHAR2(200)
   )

CREATE TABLE  "SAP_INFO_TABLT" 
   (	"TABNAME" VARCHAR2(1000), 
	"DDTEXT" VARCHAR2(1000), 
	"DEVCLASS" VARCHAR2(1000), 
	 PRIMARY KEY ("TABNAME") ENABLE
   )

Eléphanteau du PHP | 20 Messages

12 mars 2013, 17:02

Bonjour,

Je continue à charger mon script PL/SQL en lui ajoutant un "INSERT INTO" mais ça coince :
Declare
  PACKAGE_ID number ;
  PACKAGE_TYPE varchar2(5) ;
  PACKAGE_NAME varchar2(100) ;
  PACKAGE_LEVEL number ;
  PACKAGE_PARENT number ;
  PACKAGE_CHILD number ;
  PACKAGE_NEXT number ;
  PACKAGE_TEXT varchar2(300) ;
  V_DEVCLASS varchar2(30) ;
  V_TABNAME varchar2(30) ;
  V_COUNT   number ;
  CURSOR C_COMP IS SELECT * FROM SAP_COMPONENT_VIEW ;
  
Begin
  EXECUTE IMMEDIATE 'TRUNCATE TABLE SAP_PACKAGES' ;
  SELECT * FROM SAP_COMPONENT_VIEW ORDER BY PACKAGE_ID ASC ;
  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
        /*DBMS_OUTPUT.PUT_LINE( C.PACKAGE_NAME || ' ->  HF' ) ;*/
        INSERT INTO SAP_PACKAGES (PACKAGE_ID, PACKAGE_TYPE, PACKAGE_NAME, PACKAGE_LEVEL, PACKAGE_PARENT_ID, PACKAGE_CHILD_ID, PACKAGE_NEXT_ID, PACKAGE_TEXT) VALUES (PACKAGE_ID, PACKAGE_TYPE, PACKAGE_NAME, PACKAGE_LEVEL, PACKAGE_PARENT, PACKAGE_CHILD, PACKAGE_NEXT, PACKAGE_TEXT) ;
      end if ;
    else
      V_DEVCLASS := C.PACKAGE_NAME ;
      SELECT count(TABNAME) INTO V_COUNT FROM sap_info_tablt WHERE DEVCLASS = V_DEVCLASS ;
      if V_COUNT > 0 then
        /*DBMS_OUTPUT.PUT_LINE( C.PACKAGE_NAME || ' is ' || C.PACKAGE_TYPE || ' and has ' || V_COUNT || ' packages' ) ;*/
	INSERT INTO SAP_PACKAGES (PACKAGE_ID, PACKAGE_TYPE, PACKAGE_NAME, PACKAGE_LEVEL, PACKAGE_PARENT_ID, PACKAGE_CHILD_ID, PACKAGE_NEXT_ID, PACKAGE_TEXT) VALUES (PACKAGE_ID, PACKAGE_TYPE, PACKAGE_NAME, PACKAGE_LEVEL, PACKAGE_PARENT, PACKAGE_CHILD, PACKAGE_NEXT, PACKAGE_TEXT) ;
      end if ;
    end if ;
  end loop;
end;
/
Il me retourne :

Code : Tout sélectionner

ORA-06550: Ligne 17, colonne 3 : PLS-00428: une clause INTO est attendue dans cette instruction SELECT
Comment mettre un SELECT * INTO quelque chose lorsqu'on sélectionne plusieurs champs ? Et comment créer une fonction qui éviterait d'écrire deux fois la requête SQL ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 mars 2013, 23:40

salut,

le select dans le begin tu n'en n'a pas besoin, tu as le curseur pour cela.

Si tu veux récupérer une ligne tu peux utiliser une variable qui est typé sur une ligne de la table :)

quand aux reste, peux être peux tu (ré) expliquer ce que tu veux faire au final parce que la tu fait deux fois la même requête et insère deux fois des trucs null en base ;) (utilise les valeurs du curseur).

est ce que tu as réussi a déterminer ta structure ?

peux tu, maintenant, formaliser ton besoin ?

on peux réduire un peu ton script (vérifie quand même la condition)
 SET SERVEROUTPUT ON;
Declare
  V_COUNT   number ;
  total number not null default 0;
  -- Curseur de données à traiter
  CURSOR C_COMP IS SELECT * FROM SAP_COMPONENT_VIEW ;
Begin
  EXECUTE IMMEDIATE 'TRUNCATE TABLE SAP_PACKAGES' ;

  FOR C IN C_COMP Loop
  SELECT count(TABNAME) INTO V_COUNT FROM sap_info_tablt WHERE DEVCLASS = C.PACKAGE_NAME ;
    IF C.PACKAGE_TYPE = 'HF' and 
    ((C.PACKAGE_NAME IS NOT NULL AND C.PACKAGE_CHILD_ID IS NOT NULL) or (V_COUNT > 0) ) 
    then
      total := total + 1;
        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) ;
      end IF ;
    end loop;
    DBMS_OUTPUT.PUT_LINE(total || ' insertion(s) ');
end;
/
affiche : 2159 insertion(s)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 20 Messages

14 mars 2013, 14:01

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 :

Image