diff --git a/data/ddl/package/UNICAEN_TBL/body.sql b/data/ddl/package/UNICAEN_TBL/body.sql index 71aca3b1374c0a5feb6b739d75997189e3fe40cc..3f3c18e4fe17313714fd7d6078d29998a510b5a2 100644 --- a/data/ddl/package/UNICAEN_TBL/body.sql +++ b/data/ddl/package/UNICAEN_TBL/body.sql @@ -1,169 +1,165 @@ CREATE OR REPLACE PACKAGE BODY "UNICAEN_TBL" AS + TYPE t_dems_values IS TABLE OF BOOLEAN INDEX BY VARCHAR2(80); + TYPE t_dems_params IS TABLE OF t_dems_values INDEX BY VARCHAR2(30); + TYPE t_dems IS TABLE OF t_dems_params INDEX BY VARCHAR2(30); - FUNCTION MAKE_WHERE(param VARCHAR2 DEFAULT NULL, value VARCHAR2 DEFAULT NULL, - alias VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS - res VARCHAR2(120) DEFAULT ''; - BEGIN - IF param IS NULL THEN - RETURN '1=1'; - END IF; + dems t_dems; - IF alias IS NOT NULL THEN - res := alias || '.'; - END IF; - IF value IS NULL THEN - RETURN res || param || ' IS NULL'; - END IF; - RETURN res || param || ' = q''[' || value || ']'''; - END; + FUNCTION MAKE_WHERE(param VARCHAR2 DEFAULT NULL, value VARCHAR2 DEFAULT NULL, + alias VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS + res VARCHAR2(120) DEFAULT ''; + BEGIN + IF param IS NULL THEN + RETURN '1=1'; + END IF; + IF alias IS NOT NULL THEN + res := alias || '.'; + END IF; + IF value IS NULL THEN + RETURN res || param || ' IS NULL'; + END IF; + RETURN res || param || ' = q''[' || value || ']'''; + END; - FUNCTION QUERY_APPLY_PARAM(sqlQuery VARCHAR2, param VARCHAR2, value VARCHAR2) RETURN CLOB IS - pos NUMERIC; - paramLen NUMERIC; - paramComm VARCHAR2(200); - debComm NUMERIC; - endComm NUMERIC; - debReal NUMERIC; - realParam VARCHAR2(80); - realValue VARCHAR2(120); - q CLOB; - BEGIN - q := sqlQuery; - IF param IS NULL THEN - RETURN q; - END IF; + FUNCTION QUERY_APPLY_PARAM(sqlQuery VARCHAR2, param VARCHAR2, value VARCHAR2) RETURN CLOB IS + pos NUMERIC; + paramLen NUMERIC; + paramComm VARCHAR2(200); + debComm NUMERIC; + endComm NUMERIC; + debReal NUMERIC; + realParam VARCHAR2(80); + realValue VARCHAR2(120); + q CLOB; + BEGIN + q := sqlQuery; + IF param IS NULL THEN + RETURN q; + END IF; - paramlen := length(param); + paramlen := length(param); + IF value IS NULL THEN + realValue := ' IS NULL'; + ELSE + BEGIN + realValue := TO_NUMBER(value); + EXCEPTION + WHEN VALUE_ERROR THEN + realValue := 'q''[' || value || ']'''; + END; + realValue := '=' || realValue; + END IF; - IF value IS NULL THEN - realValue := ' IS NULL'; - ELSE - BEGIN - realValue := TO_NUMBER(value); - EXCEPTION - WHEN VALUE_ERROR THEN - realValue := 'q''[' || value || ']'''; - END; + LOOP + pos := instr(q, '/*@' || param, 1, 1); + EXIT WHEN pos = 0; + debComm := pos - 1; + endComm := instr(q, '*/', pos, 1); + paramComm := substr(q, debComm, endComm - debComm); + debReal := instr(paramComm, '=', 1, 1); + realParam := trim(substr(paramComm, debReal + 1)); + --realParam := 'AND ' || substr(q,pos + paramLen + 4,endComm-pos - paramLen - 4); + realParam := 'AND ' || realParam || realValue; + q := substr(q, 1, debComm) || realParam || substr(q, endComm + 2); + END LOOP; - realValue := '=' || realValue; - END IF; + RETURN q; + END; - LOOP - pos := instr(q, '/*@' || param, 1, 1); - EXIT WHEN pos = 0; - debComm := pos - 1; - endComm := instr(q, '*/', pos, 1); - paramComm := substr(q, debComm, endComm - debComm); - debReal := instr(paramComm, '=', 1, 1); + PROCEDURE CALCULER(TBL_NAME VARCHAR2) IS + BEGIN + ANNULER_DEMANDES(TBL_NAME); + CALCULER(TBL_NAME, null, null); + END; - realParam := trim(substr(paramComm, debReal + 1)); - --realParam := 'AND ' || substr(q,pos + paramLen + 4,endComm-pos - paramLen - 4); - realParam := 'AND ' || realParam || realValue; + PROCEDURE CALCULER(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS + calcul_proc varchar2(30); + BEGIN + IF NOT UNICAEN_TBL.ACTIV_CALCULS THEN RETURN; END IF; - q := substr(q, 1, debComm) || realParam || substr(q, endComm + 2); - END LOOP; - RETURN q; - END; - - - PROCEDURE CALCULER(TBL_NAME VARCHAR2) IS - BEGIN - ANNULER_DEMANDES(TBL_NAME); - CALCULER(TBL_NAME, null, null); - END; - - - PROCEDURE CALCULER(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS - calcul_proc varchar2(30); - BEGIN - IF NOT UNICAEN_TBL.ACTIV_CALCULS THEN RETURN; END IF; - - SELECT custom_calcul_proc INTO calcul_proc FROM tbl WHERE tbl_name = CALCULER.TBL_NAME; - - UNICAEN_TBL.CALCUL_PROC_PARAM := PARAM; - UNICAEN_TBL.CALCUL_PROC_VALUE := VALUE; - IF calcul_proc IS NOT NULL THEN - EXECUTE IMMEDIATE - 'BEGIN ' || calcul_proc || '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;'; - ELSE - EXECUTE IMMEDIATE - 'BEGIN UNICAEN_TBL.C_' || TBL_NAME || - '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;'; - END IF; - - END; - - - PROCEDURE DEMANDE_CALCUL(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS - BEGIN - INSERT INTO tbl_dems (ID, - TBL_NAME, - PARAM, VALUE) - VALUES (TBL_DEMS_ID_SEQ.NEXTVAL, - TBL_NAME, - PARAM, VALUE); - END; - - - PROCEDURE ANNULER_DEMANDES IS - BEGIN - DELETE FROM tbl_dems; - END; - - - PROCEDURE ANNULER_DEMANDES(TBL_NAME VARCHAR2) IS - BEGIN - DELETE FROM tbl_dems WHERE tbl_name = ANNULER_DEMANDES.tbl_name; - END; - - - FUNCTION HAS_DEMANDES RETURN BOOLEAN IS - has_dems NUMERIC; - BEGIN - SELECT count(*) INTO has_dems from tbl_dems where rownum = 1; - - RETURN has_dems = 1; - END; - - - PROCEDURE CALCULER_DEMANDES IS - TYPE t_dems IS TABLE OF tbl_dems%rowtype INDEX BY PLS_INTEGER; - dems t_dems; - i NUMERIC DEFAULT 0; - BEGIN - FOR d IN ( - SELECT DISTINCT tbl_name, param, value FROM tbl_dems - ) LOOP - i := i + 1; - dems(i).tbl_name := d.tbl_name; - dems(i).param := d.param; - dems(i).value := d.value; - END LOOP; - DELETE FROM TBL_DEMS; - COMMIT; + SELECT custom_calcul_proc INTO calcul_proc FROM tbl WHERE tbl_name = CALCULER.TBL_NAME; - i := dems.FIRST; - LOOP EXIT WHEN i IS NULL; - calculer(dems(i).tbl_name, dems(i).param, dems(i).value); + UNICAEN_TBL.CALCUL_PROC_PARAM := PARAM; + UNICAEN_TBL.CALCUL_PROC_VALUE := VALUE; + IF calcul_proc IS NOT NULL THEN + EXECUTE IMMEDIATE + 'BEGIN ' || calcul_proc || '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;'; + ELSE + EXECUTE IMMEDIATE + 'BEGIN UNICAEN_TBL.C_' || TBL_NAME || + '(UNICAEN_TBL.CALCUL_PROC_PARAM,UNICAEN_TBL.CALCUL_PROC_VALUE); END;'; + END IF; + END; - i := dems.NEXT(i); + + + PROCEDURE DEMANDE_CALCUL(TBL_NAME VARCHAR2, param VARCHAR2, value VARCHAR2) IS + BEGIN + dems(TBL_NAME)(param)(value) := TRUE; + END; + + + + PROCEDURE ANNULER_DEMANDES IS + BEGIN + dems.delete; + END; + + + + PROCEDURE ANNULER_DEMANDES(TBL_NAME VARCHAR2) IS + BEGIN + dems(tbl_name).delete; + END; + + + + FUNCTION HAS_DEMANDES RETURN BOOLEAN IS + BEGIN + RETURN dems.count > 0; + END; + + + + PROCEDURE CALCULER_DEMANDES IS + d t_dems; + tbl_name VARCHAR2(30); + param VARCHAR2(30); + value VARCHAR2(80); + BEGIN + d := dems; + dems.delete; + + tbl_name := d.FIRST; + LOOP EXIT WHEN tbl_name IS NULL; + param := d(tbl_name).FIRST; + LOOP EXIT WHEN param IS NULL; + value := d(tbl_name)(param).FIRST; + LOOP EXIT WHEN value IS NULL; + calculer(tbl_name, param, value); + value := d(tbl_name)(param).NEXT(value); END LOOP; + param := d(tbl_name).NEXT(param); + END LOOP; + tbl_name := d.NEXT(tbl_name); + END LOOP; + + IF HAS_DEMANDES THEN -- pour les boucles !! + CALCULER_DEMANDES; + END IF; + END; - IF HAS_DEMANDES THEN -- pour les boucles !! - CALCULER_DEMANDES; - END IF; - END; - -- AUTOMATIC GENERATION -- + -- AUTOMATIC GENERATION -- PROCEDURE C_AGREMENT(param VARCHAR2, value VARCHAR2) IS TYPE r_cursor IS REF CURSOR;