Elyspio

S3 TD 1

Sep 11th, 2018
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.60 KB | None | 0 0
  1. CREATE PACKAGE pksorties AS
  2.  
  3.     FUNCTION les_minibus RETURN NUMBER;
  4.     FUNCTION affectations_minibus(p sortie.nosortie%TYPE) RETURN NUMBER;
  5.  
  6. END;
  7.  
  8.  
  9. CREATE OR REPLACE PACKAGE BODY pksorties AS
  10.   TYPE type_tabminibus IS TABLE OF minibus%ROWTYPE INDEX BY BINARY_INTEGER;
  11.   v_err VARCHAR2(255);
  12.   v_tableminibus type_tabminibus;
  13.  
  14.  
  15.   FUNCTION les_minibus
  16.     RETURN NUMBER AS
  17.  
  18.     CURSOR c_minibus IS SELECT *
  19.                         FROM MINIBUS
  20.                         ORDER BY CAPACITE DESC;
  21.     v_i NUMBER(4) := 1;
  22.  
  23.     BEGIN
  24.  
  25.       FOR v_tab IN c_minibus LOOP
  26.         v_tableminibus(les_minibus.v_i) := v_tab;
  27.         les_minibus.v_i := les_minibus.v_i + 1;
  28.       END LOOP;
  29.  
  30.       RETURN v_i;
  31.  
  32.       EXCEPTION
  33.       WHEN OTHERS
  34.       THEN
  35.         v_err := CURRENT_DATE || '\t' || SQLERRM || '\t' || SQLCODE;
  36.         INSERT INTO ERREURS VALUES (v_err);
  37.         RETURN -1;
  38.  
  39.  
  40.     END;
  41.  
  42.   FUNCTION affectations_minibus(p IN sortie.nosortie%TYPE)
  43.     RETURN NUMBER AS
  44.  
  45.     CURSOR c_users IS SELECT *
  46.                       FROM INSCRIPTION_SORTIE
  47.                       WHERE INSCRIPTION_SORTIE.NOSORTIE = p
  48.                       ORDER BY INSCRIPTION_SORTIE.DATE_INSCRIPTION ASC FOR UPDATE;
  49.  
  50.     v_nb_minibus  NUMBER(4) := les_minibus();
  51.  
  52.     v_nb_occupant NUMBER(4);
  53.  
  54.     v_i           NUMBER(4) := 1;
  55.  
  56.     v_user        INSCRIPTION_SORTIE%ROWTYPE;
  57.  
  58.  
  59.     v_err         ERREURS.MESSAGE%TYPE;
  60.  
  61.     noInput EXCEPTION ;
  62.  
  63.     BEGIN
  64.       OPEN c_users;
  65.       FETCH c_users INTO v_user;
  66.  
  67.  
  68.  
  69.       WHILE NOT (c_users%NOTFOUND) AND v_i <= v_nb_minibus
  70.       LOOP
  71.         SELECT COUNT(*)  INTO v_nb_occupant FROM INSCRIPTION_SORTIE WHERE NOMINIBUS = v_tableminibus(v_i).NOMINIBUS;
  72.  
  73.         IF(v_nb_minibus = 0) THEN
  74.           RETURN 0;
  75.         END IF;
  76.  
  77.         IF v_nb_occupant >= v_tableminibus(v_i).CAPACITE
  78.         THEN
  79.           v_i := v_i + 1;
  80.         END IF;
  81.  
  82.  
  83.         IF v_i <= v_nb_minibus
  84.         THEN
  85.  
  86.           UPDATE INSCRIPTION_SORTIE SET INSCRIPTION_SORTIE.NOMINIBUS = v_tableminibus(v_i).NOMINIBUS WHERE CURRENT OF c_users;
  87.  
  88.         END IF;
  89.         FETCH c_users INTO v_user;
  90.  
  91.       END LOOP;
  92.  
  93.       CLOSE c_users;
  94.  
  95.       EXCEPTION
  96.       WHEN NO_DATA_FOUND
  97.       THEN
  98.         v_err := SYSDATE || '\t' || SQLERRM || '\t' || SQLCODE;
  99.         INSERT INTO ERREURS VALUES (v_err);
  100.         RETURN -1;
  101.  
  102.       WHEN OTHERS
  103.       THEN
  104.         v_err := SYSDATE || '\t' || SQLERRM || '\t' || SQLCODE;
  105.         INSERT INTO ERREURS VALUES (v_err);
  106.         RETURN -2;
  107.  
  108.     END;
  109.  
  110. END;
  111.  
  112.  
  113.   BEGIN
  114.     DBMS_OUTPUT.put_line(pksorties.AFFECTATIONS_MINIBUS(1));
  115.   END;
Advertisement