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 113 114 115 116 117 118 119 120 121 122 123 124
| PROCEDURE P_delete_record IS
str_cur_blk VARCHAR2(60);-- Le nom du block sur lequel on veut faire un delete
str_first_itm VARCHAR2(60);-- Le 1er item du block
str_last_itm VARCHAR2(60);-- Le dernier item du block
str_cur_itm VARCHAR2(60);-- L'item courant que l'on est en train de lire
str_pk VARCHAR2(10);-- Variable indiquant si l'item fais partie de la clé primaire
str_colname VARCHAR2(60);-- Nom de la colonne auquel se réfère l'item
str_type VARCHAR2(20);-- Type de donné de l'item (char, nimber, etc...)
str_where VARCHAR2(5000);-- Chaine de carctère dans laquelle on sotcke la clause where
str_value VARCHAR2(2000);-- Variable stoquant la valeur du champ que l'on est en train de lir
str_delete VARCHAR2(5000);-- Varaible contenant l'instrucation SQL a executer correspondant au delete
str_nomtable VARCHAR2(60);-- Le nom de la table sur lequel se réfère le block
str_typedonne VARCHAR2(30); -- Type de source de donnée du block (table, procédure, etc...
num_bouton NUMBER;
Exit_Procedure EXCEPTION;
Cle_etrangere EXCEPTION;
-- On définie une exception avec le code ORA correspondant
-- a l'erreur du à l'intégrité référentiel.
PRAGMA EXCEPTION_INIT(Cle_etrangere, -2292);
BEGIN
-- Initialisation des variables
str_where := '';
str_nomtable := '';
str_typedonne := '';
str_cur_blk := :System.Cursor_Block;
--On repère le 1er item du block et on se positionne dessus
str_first_itm := Get_Block_Property(str_cur_blk, FIRST_ITEM );
str_last_itm := Get_Block_Property(str_cur_blk, LAST_ITEM );
str_cur_itm := str_first_itm;
WHILE str_cur_itm != str_last_itm LOOP
-- On regarde si l'item fait partie d'une clé primaire
str_pk := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,PRIMARY_KEY);
If str_pk = 'TRUE' then
-- On recupère le nom de la colonne associée à l'item (en général identique mais pas toujours)
str_colname := nvl(GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,COLUMN_NAME),str_cur_itm);
-- On récupère le type de variable
str_type := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,DATATYPE);
If str_type in ('ALPHA', 'CHAR', 'LONG') then
str_value := ''''||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||'''';
elsif str_type in ('INT', 'RINT', 'NUMBER', 'RNUMBER', 'MONEY', 'RMONEY') then
str_value := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE);
elsif str_type = 'DATE' then
str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''DD-MON-YY'')';
elsif str_type = 'JDATE' then
str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''MM/DD/YY'')';
elsif str_type = 'EDATE' then
str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''DD/MM/YY'')';
elsif str_type = 'DATETIME' then
str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''DD-MON-YY HH24:MI:SS'')';
else
-- On ne sait pas gérer ce cas type
Raise Exit_Procedure;
end if;
-- L'item courant faisant partie de la clé primaire (donc basé et non nul) on le rajoute à la clause Where
str_where := str_where||' AND '||str_colname||' = '||str_value;
End if;
str_cur_itm := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,NEXTITEM);
END LOOP;
-- Si la chaine where n'est pas vide alors cela veut dire qu'elle commence par un AND qu'on doit enlever
If str_where is not null then
str_where := LTRIM(str_where,'AND ');
end if;
--On récupère le nom de la table sur lequel est basé le block
str_typedonne := GET_BLOCK_PROPERTY(str_cur_blk, QUERY_DATA_SOURCE_TYPE);
If str_typedonne = 'TABLE' then
str_nomtable := GET_BLOCK_PROPERTY(str_cur_blk, QUERY_DATA_SOURCE_NAME);
-- Si le nom de la table est un synonyme, alors on va prendre plutot le nom
-- de la table en enlevant le 's' devant car le delete sera executé depuis
-- une procèdure sotckée
str_nomtable := LTRIM(str_nomtable,'s');
end if;
-- Si le block n'est pas basé sur une table
-- ou si la clause where ne s'est pas construite
-- (car le block n'a pas de clé primaire défini par exemple)
-- Alors on ne sais pas gérer le cas
If str_nomtable is null Or str_where is null then
Raise Exit_Procedure;
end if;
-- Construction de la requete
str_delete := 'delete from '||str_nomtable||' where '||str_where;
-- On execute l'instruction SQL a l'aide d'un EXECUTE IMMEDIATE placé en procédure stocké
sps_com_exec_sql(str_delete);
execute_query;
EXCEPTION
when Cle_etrangere then
message('L''enregistrement est référencé');
raise form_trigger_failure
--Echec de la tentative de delete, on laisse l'appilcation gérer la suppresion
when Exit_Procedure then
delete_record;
END; |
Partager