sql 代码来源d-post后bac
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 代码来源d-post后bac相关的知识,希望对你有一定的参考价值。
--
-- le code ci-dessous a a été fortement amélioré par un effor collaboratif sur
-- https://github.com/jeantil/admission_post_bac
-- Pull requests, issues et contributions wiki sont les bienvenues.
-- Une partie du code a été rétro analysé a partir de diverses sources cf https://github.com/jeantil/admission_post_bac/wiki
--
FUNCTION gen class alea V1 relatif grp(
o_g_ea_cod_ins IN VARCHAR2,
o_g_ti_cod IN NUMBER,
o_c_gp_cod IN NUMBER,
o_g_tg_cod IN NUMBER,
login IN VARCHAR2,
type_login IN NUMBER,
mode_dev IN NUMBER,
confirm IN NUMBER,
saio IN NUMBER,
nip IN VARCHAR2,
indic IN NUMBER,
mess_err OUT VARCHAR2,
mess_aff OUT VARCHAR2
)
RETURN NUMBER IS
retour NUMBER;
X VARCHAR2(2);
dummy NUMBER;
dummy2 NUMBER;
l_c_gp_flg_sel c_grp.c_gp_flg_sel%TYPE;
l_g_tg_cod c_grp.g_tg_cod%TYPE;
l_c_gp_eta_cla c_grp.c_gp_eta_cla%TYPE;
l_g_flh_sel sp_g_tri_ins.g_flh_sel%TYPE;
l_g_fr_reg_for g_for.g_fr_reg_for%TYPE;
l_g_ea_cod_ges g_tri_ins.g_ea_cod_ges%TYPE;
l_c_ja_cod c_jur_adm.c_ja_cod%TYPE;
l_c_tj_cod c_jur_adm.c_tj_cod%TYPE;
i NUMBER;
IS_prod NUMBER;
l_six_voe NUMBER;
UNIOUE CONSTRAINT EXCEPTION;
PRAGMA EXCEPTION_INIT (UNIOUE_CONSTRAINT, -00001);
--classement aléatoire sur voeu 1 groupé relatif
CURSOR classement_aleatoire_efe IS
-- on traite d'abord les candidats AEFE s'il y en a
SELECT c.g_cn_cod,
a_ve_ord_vg_rel, -- Ordre du voeu avec voeux groupés relatifs licence
a_ve_ord_aff, -– Ordre du voeu avec Voeux groupé relatif licence et tous les autres voeux
a_vg_ord, -- Ordre du sous-voeu dans le voeu groupé
DBMS RANDOM.value(1,999999),
i.iep_cod
FROM g_can c, i_ins i, a_rec r, a_voe v
WHERE i.g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND NVL(g_cn_flg_aefe, 0)=1 -- BaC EFE
AND i_ep_cod IN (2, 3) --Pointés recu (complet ou incomplet)
AND i.i_is_val=1 --non encore classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4,5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod
UNION
-– les candidats EFE qui n ont au final pas classé la formation dans leur liste ordonnée. Ils sont classé, mais en dernier.
SELECT c.g_cn_cod,
0,
0,
0,
DBMS RANDOM.value(1,999999),
i.iep_cod
FROM g_can c, i_ins i, a_rec r
WHERE i.g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND NVL(g_cn_flg_aefe, 0)=1 -- BaC EFE
AND i_ep_cod IN (2, 3) --Pointés recu (complet ou incomplet)
AND i.i_is_val=1 --non encore classé
-- non encore Classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4, 5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND NOT EXISTS (SELECT 1 FROM a_voe v WHERE c.g_cn_cod=v.g_cn_cod AND r.g_ta_cod=v.g_ta_cod)
ORDER BY 2, 3, 4,5;
/** **/
/** **/
/** **/
/** **/
/** **/
CURSOR class_aleatoire_autres_cddts IS
-- les candidats non classés par la requête ci-dessus : les autre bac que EEE
SELECT C.g_cn_cod,
DECODE(l_six_voe, 1, six_voeu_L1(c.g_cn_cod, g_aa_cod_bac_int, g_cn_flg_int_aca,o_g_tg_cod), 0),
a_ve_ord_vg_rel, -– Ordre du voeu avec voeux groupés relatifs licence
a_ve_ord_aff, –- Ordre du voeu avec Voeux groupé relatif licence et tous les autres voeux
a_vg_ord, -- Ordre du sous-voeu dans le voeu groupé
DBMS RANDOM.value(1999999),
i.i_ep_cod,
i.i_is_dip_val -- Pour ceux-ci on prend en plus en compte la validité du diplôme
FROM g_can c, i_ins i, a_rec r, a_voe v
WHERE i.g_ti_cod=o_g_ti_cod
AND i.g_gf_cod=o_c_gp_cod
AND i_ep_cod IN (2, 3) -- Pointés recu (complet ou incomplet)
AND i.g_cn_cod=c.g_cn_cod
--TODO2016 => Traiter les groupes néo-réeo ensemble différement (voir Correction_classements_neo-reo.sql dans exploit/admissions/simulation/pb ponctuels)
AND c.g_ic_cod > 0
AND i.i_is_val=1
--non encore classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4, 5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod
UNION
-- les candidats qui n ont au final pas classé la formation dans leur liste ordonnée. Ils sont classé, mais en dernier.
SELECT c.g_cn_cod,
0,
0,
0,
0,
DBMS_RANDOM.value(1,999999),
i.i_ep_cod,
i.i_is_dip_val -- Pour ceux-ci on prend en plus en compte la validité du diplôme
FROM g_can c, i_ins i, a_rec r
WHERE i.g_ti_cod=o_g_ti_cod
AND i.g_gf_cod=o_c_gp_cod
AND i_ep_cod IN (2, 3) -- Pointés recu (complet ou incomplet)
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND i.i_is_val=1
-- non enCOre Classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4, 5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND NOT EXISTS (SELECT 1 FROM a_voe v WHERE c.g_cn_cod=v.g_cn_cod AND r.g_ta_cod=v.g_ta_cod)
ORDER BY 2 desc, 3, 4, 5, 6;
BEGIN
-- par défaut, on est pas en prod
IS prod:=0;
-- On vérifie que si on force un classement, on n'est pas en base de prod
X:='01';
BEGIN
SELECT DISTINCT 1 INTO dummy
FROM all catalog
WHERE OWNER IN ('XXXXXX');
-- on est en prod
IS prod:=1;
-- on ne laisse passer qu'en indic = 10
IF NVL(indic, 0) NOT IN (10)
THEN mess_aff:='On ne peut forcer un classement sur la base d''exploitation.',
ROLLBACK;
RETURN 1;
END IF;
EXCEPTION WHEN NO DATA FOUND THEN NULL;
END;
mess_aff:= 'Problème d''accès aux données, veuillez Vous reconnecter ultérieurement.';
-- On vérifie si le groupe est issu d''une formation de type IDF 2, 3, 5 ou 6 et s''il concerné par des néO d''IDF
-- alors, on utilisera les six voeux dans le classement sur ordre des voeux
BEGIN
Х:="02";
SELECT 1
INTO l_six_voe
FROM g_tri_ins ti
WHERE g_ti_cod=o_g_ti_cod
AND NVL(g_ti_flg_rec_idf, 0) IN (2, 3, 5, 6)
AND o_g_tig_cod IN (21, 25, 26, 41, 45,46);
EXCEPTION
WHEN NO DATA FOUND
THEN l_six_voe:=0; -- pour les autres groupes, on n'utilise pas les 6 voeux
END;
X:='03';
-- on vérifie que le classement ne soit pas déjà passé (pas de candidats classés dans C_can_grp)
BEGIN
-- Si le groupe est non sélectif, aucun candidat ne doit avoir été traité
SELECT DISTINCT 1
INTO dummy
FROM c_can_grp cg, c_grp g
WHERE g.c_gp_cod=o_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod
AND NVL(c_gp_flg_sel, 0)=0
UNION
-- Si le groupe est sélecif ou à pré-requis, on peut avoir des Candidats NC ou AC
SELECT DISTINCT 1
FROM c_can_grp cg, c_grp g
WHERE g.c_gp_cod=o_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod
AND NVL(c_gp_flg_sel, 0) IN (1,2)
AND i_ip_cod NOT IN (4, 6);
mess_aff='Un classement a déjà été saisi pour le groupe de cette formation :'
|| o_g_ea_cod_ins||','||o_g_ti_cod||','|| o_c_gp_cod;
ROLLBACK;
RETURN 1;
EXCEPTION WHEN NO DATA FOUND THEN NULL; -- ok
END;
-- c'est ok, on va générer. On commence par récupérer des infos en base
BEGIN
X:='04';
SELECT g_tg_cod, c_gp_flg_sel,
g_ea_cod_ges, ja.c_ja_cod, c_tj_cod,
NVL(g_ti_flh_sel, g_fr_flg_sel), c.gp_eta_cla
INTO l_g_tg_cod, l_c_gp_flg_sel,
l_g_ea_cod_ges, l_c_ja_cod, l_c_tj_cod,
l_g_flh_sel, l_c_gp_eta_cla
FROM g_for fr, g_tri_ins ti, c_jur_adm ja, c_grp gp
WHERE ti.g_ti_cod=o_g_ti_cod
AND ti.g_fr_cod_ins=fr.g_fr_cod
AND ti.g_ti_cod=ja.g_ti_cod
AND ja.c_ja_cod=gp.c_ja_cod
AND gp.c_gp_cod=o_c_gp_cod;
EXCEPTION
WHEN NO DATA FOUND
THEN mess_aff:='Erreur de traitement, la ligne groupe n''existe pas : c_gp_Cod :'
|| o_c_gp Cod;
ROLLBACK;
RETURN 1;
END;
-- on vérifie les Conditions de traitement du groupe
IF IS_prod=0 -- Base de test
OR -- Ou
-- en prod pour les classements formation non sélectives ou les AEFE
(IS prod=1 AND indic=10 AND l_g_flh_sel=0)
THEN NULL; -- on laisse passer. Dans tous les autre cas, c'est une erreur.
ELSE mess_aff='On ne peut traiter ce type de classement aléatoire dans ces conditions :
'||
'ls_prod : ' || IS_prod || ', indic : ' || indic || 'Flag Sel : '|| l_c_gp_flg_sel;
ROLLBACK;
RETURN 1;
END IF;
-- on vérifie l'état de pointage des dossiers sion est en prod, on est obligé d'accepter
-- des dossiers non reçus, pour les vérifs de diplômes
X:='05';
SELECT COUNT(*) INTO dummy
FROM i_ins i
WHERE g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i_is_val=1
AND i_ep_cod NOT IN(0, 2, 3, 7);
IF dummy > 0
THEN mess_aff:='Pb, des dossiers ne sont pas pointés : étab :'
|| o_g_ea_cod_ins || ', for :' || o_g_ti_cod || ', grp : ' || o_c_gp_cod;
ROLLBACK;
RETURN 1;
END IF;
I:=1;
X:='61';
FOR c_rec IN classement_aleatoire_efe
LOOP BEGIN
INSERT INTO c_can_grp (
g Cn Cod, C. gp_Cod,
iip Cod, C CE ran)
VALUES (
C. rec.g. cn Cod, O C_gp Cod,
5, i);
EXCEPTION -- Si le Candidat est déjà indiqué à classer, on met à jour le i_ip_cod et le rang sur la ligne existante
WHEN UNIOUE_CONSTRAINT
THEN X:='07';
UPDATE c can grp
SET i_ip Cod=5,
C Cg ran=i
WHEREg Cn cod=c rec.g. cn cod
AND C gp Cod=O C. gp Cod
AND iip cod=6;
IF SOL%ROWCOUNT!=1
THEN mess err:='pk_generation_classement.gen_class_alea_V1_relatif_grp
X : (' || Х || ')'
||'Erreur traitement d''un candidat AC pour l''étab'
|| o_g_ea_cod_ins ||' et la formation '|| o_g_ti_cod||':
'||o_c_gp_cod||', le candidat'||c_rec.g_cn_cod
||' et le groupe : '||o_c_gp_cod||', rg :'||i;
ROLLBACK;
RETURN -1;
END IF;
END;
i:= i+1;
END LOOP;
X:='08';
FOR c_rec IN class_aleatoire_autres_cddts
LOOP -- diplôme non validé => non classé
IF c_rec.i_is_dip_val=1
THEN BEGIN
INSERT INTO c_can_grp (
g_cn_cod, c_gp_cod,
i_ip_cod, c_cg_ran)
VALUES ( c_rec.g_cn_cod, o_c_gp_cod,4,NULL );
EXCEPTION -- Si le candidat est déjà non classé, on ne met à jour
WHEN UNIOUE_CONSTRAINT
THEN NULL;
END;
ELSE
BEGIN
Х:='09';
INSERT INTO c can grp (g_cn_cod, c_gp_cod,
i_ip_cod, c_cg_ran)
VALUES (c.rec_g_cn_cod, o_c_gp_cod,5, i);
EXCEPTION -- Si le Candidat est déjà à classer, on ne met à jour
WHEN UNIOUE_CONSTRAINT
THEN X:='10';
UPDATE c_can_grp
SET iip Cod=5,
C Cg ran=i
WHEREg_Cn Cod=c rec.g. cn Cod
AND C gp Cod=O C. gp Cod
AND iip cod=6;
IF SOL%ROWCOUNT!=1
THEN
mess_err:='pk_generation_classement.gen_class_alea_V1_relatif_grp X: ('||X||')'
||'Erreur traitement d''un candidat AC pour l''étab'
|| o_g_ea_cod_ins||' et la formation
'|| o_g_ti_cod||': ' ||o_C_gp_cod||', le candidat ' || c_rec.g_Cn_Cod
||'et le groupe : '||o_c_gp_cod||', rg:'||i;
ROLLBACK;
RETURN -1;
END IF;
END;
i:=i+1;
END IF;
END LOOP;
-- le classement est marqué terminé
Х:='11';
retour:=pk_new_classement_commun.MAJ_etat_classement(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod,
l_c_ja_cod, l_c_tj_cod, o_c_gp_cod,
2, 5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retour!=0
THEN ROLLBACK;
RETURN retour;
END IF;
-- On vérifie que le classement soit valide. la Trace est mise par cette PS
X:='12';
retour:=pk_new_classement_commun.valid_classement_def(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod,
l_c_ja_cod, l_c_tj_cod, o_c_gp_cod,
5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retourl!=0
THEN ROLLBACK;
RETURN retour;
END IF;
X:='13';
retour:=pk_new_classement_commun.valid_classement_formation(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod, 5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retour!=0
THEN ROLLBACK;
RETURN retour;
END IF;
-- on indique que le classement est fait de manière automatique
-- et on gère le cas particulier des AC/NC eta_cla passe de 3 à 4
X:='14';
UPDATE c_grp SET c_gp_flg_cla_oto=1,
c_gp_eta_cla=DECODE(l_c_gp_eta_cla, 3, 4, c_gp_eta_cla)
WHERE c_gp_cod=o_c_gp_cod
AND c_gp_eta_cla=2;
COMMIT;
RETURN 0;
EXCEPTION
WHEN OTHERS
THEN mess err:='pk generation classement.gen class alea V1 relatif grp X: ('||X||')'
||'Erreur ORACLE'||TO_CHAR(sqlcode)||''||sqlerrm||' pour l''étab'
||o_g_ea_cod_ins||' et la formation'|| og ti Cod||': '||o_c_gp_cod;
ROLLBACK;
RETURN -9;
END gen_class_alea_V1_relatif_grp;
以上是关于sql 代码来源d-post后bac的主要内容,如果未能解决你的问题,请参考以下文章