CREATE OR REPLACE FUNCTION f_fact(n IN NUMBER)
RETURN NUMBER
IS
    facto NUMBER := 1; -- Initialisation de la variable pour stocker la factorielle
    est_negative EXCEPTION; -- Exception personnalisée pour les nombres négatifs
BEGIN
    -- Vérifier si le nombre est négatif
    IF n < 0 THEN
        RAISE est_negative; -- Lever l'exception si le nombre est négatif
    END IF;

    -- Calcul de la factorielle avec une boucle FOR
    FOR i IN 1..n LOOP
        facto := facto * i;
    END LOOP;

    -- Retourner la valeur calculée
    RETURN facto;

EXCEPTION
    WHEN est_negative THEN
        -- Gestion de l'exception pour les nombres négatifs
        DBMS_OUTPUT.PUT_LINE('Attention ! Vous avez entré un nombre négatif.');
        RETURN NULL; -- Retourner NULL en cas d'erreur
    WHEN OTHERS THEN
        -- Gestion des autres exceptions
        DBMS_OUTPUT.PUT_LINE('Erreur inattendue : ' || SQLERRM);
        RETURN NULL; -- Retourner NULL en cas d'erreur
END f_fact;
/

-- Tester la fonction
BEGIN
    DBMS_OUTPUT.PUT_LINE('Factorielle de 5 : ' || f_fact(5)); -- Exemple avec un nombre positif
    DBMS_OUTPUT.PUT_LINE('Factorielle de -3 : ' || f_fact(-3)); -- Exemple avec un nombre négatif
END;
/
DECLARE 
    MOY NUMBER; -- Pour stocker la moyenne des salaires
    s NUMBER := 0; -- Variable pour accumuler la somme des salaires
    v_sal employees.salary%TYPE; -- Variable pour stocker un salaire
    emp_curs SYS_REFCURSOR; -- Curseur pour sélectionner les salaires

BEGIN
    -- Ouvrir le curseur
    OPEN emp_curs FOR 
        SELECT salary 
        FROM employees 
        WHERE dept_employees = 20 OR dept_employees = 90;
    
    -- Boucle pour parcourir les salaires
    LOOP
        -- Récupérer chaque salaire dans v_sal
        FETCH emp_curs INTO v_sal;
        
        -- Sortir de la boucle si le curseur n'a plus de lignes
        EXIT WHEN emp_curs%NOTFOUND;
        
        -- Accumuler la somme des salaires
        s := s + v_sal.salary;
    END LOOP;

    -- Calculer la moyenne si des salaires ont été trouvés
    IF emp_curs%ROWCOUNT > 0 THEN
        MOY := s / emp_curs%ROWCOUNT;
        DBMS_OUTPUT.PUT_LINE('La moyenne des salaires est : ' || MOY);
    ELSE
        DBMS_OUTPUT.PUT_LINE('Aucun salaire trouvé pour les départements spécifiés.');
    END IF;

    -- Fermer le curseur
    CLOSE emp_curs;

END;
/



 

PL/SQL Online Compiler

Write, Run & Share PL/SQL code online using OneCompiler's Oracle PL/SQL online editor and compiler for free. It's one of the robust, feature-rich online editor and compiler for Oracle PL/SQL running on latest version 23c (23.3.0.0). Getting started with the OneCompiler's Oracle PL/SQL editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'PL/SQL' and start writing code to learn and test online without worrying about tedious process of installation.

About PL/SQL

PL/SQL is procedural extension for SQL created by Oracle. It is by default embedded into the Oracle Database. PL/SQL program units are compiled and stored inside the Oracle Database which results in optimal execution times as the PL/SQL and SQL run within the same server process.

Syntax help

Following is the syntax structure for the PL/SQL code blocks

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)>
EXCEPTION 
   <exception handling> 
END;

Example

DECLARE 
   message  varchar2(100):= 'Hello, World!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

Named procedures

CREATE OR REPLACE FUNCTION 
hello_user
   (user_name IN VARCHAR2) 
    RETURN VARCHAR2
IS
BEGIN
   RETURN 'Hello ' || user_name;
END hello_user;
/

BEGIN
   dbms_output.put_line(hello_user('Peter'));
END;
/

Exception handling

BEGIN
  DBMS_OUTPUT.put_line (1/0);
EXCEPTION
  WHEN OTHERS
  THEN
    DBMS_OUTPUT.put_line ('error is: ' || SQLERRM);
END;