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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| CREATE SEQUENCE T_IDENTITES_Seq INCREMENT BY 1 NOMAXVALUE NOMINVALUE NOCYCLE CACHE 20 NOORDER;
CREATE OR REPLACE TRIGGER T_IDENTITES_ID_Trg
before insert on T_IDENTITES
for each row
BEGIN
:new.ID := T_IDENTITES_Seq.nextval ;
END;
/
CREATE OR REPLACE PROCEDURE CREER_IDENTITES
(
PNOMBRE NUMBER
)
AS
I NUMBER;
vID NUMBER;
vMODULO NUMBER;
vSEXE CHAR(1);
vDATE_NAISS DATE;
vMOIS NUMBER;
vJOUR NUMBER;
vANNEE NUMBER;
vMAX_PRENOMS NUMBER;
vMIN_PRENOMS NUMBER;
vNB_PRENOMS NUMBER;
vPRENOM NUMBER;
vMAX_NOMS NUMBER;
vMIN_NOMS NUMBER;
vNB_NOMS NUMBER;
vNOM NUMBER;
vNOM2 NUMBER;
BEGIN
I := 0;
SELECT MAX(ID) INTO vID FROM T_IDENTITES;
vID := vID +1;
SELECT MAX(ID),MIN(ID) INTO vMAX_PRENOMS,vMIN_PRENOMS FROM T_PRENOMS;
vNB_PRENOMS := vMAX_PRENOMS - vMIN_PRENOMS;
SELECT MAX(ID),MIN(ID) INTO vMAX_NOMS,vMIN_NOMS FROM T_NOMS;
vNB_NOMS := vMAX_NOMS - vMIN_NOMS;
WHILE (I < PNOMBRE) DO
BEGIN
I := I + 1;
vID := T_IDENTITES_ID_Trg;
vMODULO := vID - ((vID /2) * 2);
IF (vMODULO = 0)
THEN
vSEXE := 'F';
ELSE
vSEXE := 'M';
END IF;
vMODULO := vID - ((vID /12) * 12);
vMOIS := vMODULO + 1;
vMODULO := vID - ((vID /28)) * 28);
vJOUR := vMODULO + 1;
vMODULO := vID - ((vID /99) * 99);
vANNEE := vMODULO + 1903;
vDATE_NAISS := vMOIS||'/'||vJOUR||'/'||vANNEE;
vMODULO := vID - ((vID / vNB_PRENOMS) * vNB_PRENOMS);
vPRENOM := vMODULO + vMIN_PRENOMS;
vMODULO := vID - ((vID / vNB_NOMS) * vNB_NOMS);
vNOM := vMODULO + vMIN_NOMS;
INSERT INTO T_IDENTITES (
ID,
SEXE,
DATE_NAISS )
VALUES (
vID,
vSEXE,
vDATE_NAISS );
INSERT INTO T_PRENOMS_IDENTITES (
IDENTITE,
PRENOM,
USUEL )
VALUES (
vID,
vPRENOM,
'U' );
INSERT INTO T_NOMS_IDENTITES (
IDENTITE,
NOM,
NATURE )
VALUES (
vID,
vNOM,
'N' ); /* Nom de naissance */
vMODULO := vID - ((vID /4) * 4);
IF (vMODULO = 0) THEN /* Une femme sur deux */
BEGIN
vNOM2 := vMIN_NOMS + vMAX_NOMS - vNOM; /* Autre valeur dans le même intervalle */
IF (vNOM = vNOM2) THEN vNOM2 = vNOM2 + 1;
INSERT INTO T_NOMS_IDENTITES (
IDENTITE,
NOM,
NATURE )
VALUES (
vID,
vNOM2,
'M' ); /* Nom marital */
END IF;
END ;
END ;
END ;
/
SET TERM OFF;
COMMIT WORK; |
Partager