Crearea unei functii

Sintaxa:

CREATE [OR REPLACE] FUNCTION  nume_functie [(…)] RETURN return_type {IS|AS}
corpul_functiei;
RETURN expr;

In interiorul corpului functiei  declaratia  RETURN este utilizatã  pentru a intoarce  controlul programului apelant impreuna cu o valoare.
• o functie este foarte  asemanatoare unei proceduri.
• ambele pot fi  stocate in baza de date sau declarate  in interiorul unui bloc (o functie locala)
• functia trebuie sa intoarca o valoare  (sau poate intoarce mai multe valori prin intermediul parametrilor precum procedurile) -- ideal este  sa intoarca doar o sigura valoare - pentru celelalte situatii - mai multe valori respectiv nici o valoare, se vor folosi procedurile

Urmatoarele  doua exemple aratã diferenta dintre  proceduri si functii in modul lor de declarare si  apelare.

 Se creazã o  procedura ‘adauga_student’ si se memoreaza in baza de date

CREATE OR REPLACE PROCEDURE adauga_student( p_nume student.nume%TYPE,
               p_prenume student.prenume%TYPE,
               p_specializare student.specializare%TYPE DEFAULT ‘calculatoare’) AS
BEGIN
              INSERT INTO student
                     VALUES(student_sequence.nextval, p_nume, p_prenume, p_specializare);
              COMMIT;
END adauga_student;

Pentru a testa procedura “adauga_student”, in alt bloc  PL/SQL ,aceasta va fi apelata astfel:

BEGIN
           adauga_student(‘Marinescu’, ‘Dan’);
END;

Se  va crea functia ‘Grupa_completa’ si se va memora in baza de date.

CREATE OR REPLACE FUNCTION Grupa_completal(
                            p_specializare  grupe.specializare%TYPE,
                            p_curs grupe.curs%TYPE) RETURN BOOLEAN IS
                            v_curStudent NUMBER;
                            v_maxStudent NUMBER;
                            v_returnValue BOOLEAN;
BEGIN
                           SELECT cur_student, max_student INTO v_curStudent, v_maxStudent
                           FROM grupe
                           WHERE specializare = p_specializare AND curs = p_curs;

                           IF v_curStudent >= v_maxStudent
                                 v_returnValue = TRUE;
                          ELSE v_returnValue = FALSE;

                          RETURN v_returnValue;
END Grupa_completa;

In alt bloc  PL/SQL se va apela funcxtia dupa cum urmeaya:

BEGIN
        IF Grupa_completa(‘calculatoare’, ‘Oracle’) THEN
           DBMS_OUTPUT.PUT_LINE(‘grupa este completa’);
        ELSE DBMS_OUTPUT.PUT_LINE(‘grupa nu este completa’);
END;

Exemplu de functie locala

DECLARE
        CURSOR c_totistudentii IS
              SELECT nume, prenume
              FROM student;
        v_formatareNume VARCHAR2(50);

       -- definitia functiei va fi facuta mai tarziu    – toate variabilele trebuie definite  inainte
       FUNCTION formatNume(p_nume IN VARCHAR2, p_prenume IN VARCHAR2)
                    RETURN VARCHAR2 IS
       BEGIN
                    RETURN p_nume || ‘ ‘ || p_prenume;
       END formatNume;

-- Inceputul blocului principal
BEGIN
          FOR v_studentRecord IN c_totiStudentii
          LOOP
                    v_formatareNume := formatNume(v_studentRecord.nume,
                                                                                           v_studentRecord.prenume);
                                   INSERT INTO temp_table(fname) VALUES (v_formatareNume);
         END LOOP;
         COMMIT;
END;

Apelul procedurilor stocate  de la prompt-ul  SQL*PLUS
In mod uzual, procedurile si functiile sunt  apelate in cadrul sectiunilor  de executabile sau  de manipulare a exceptiilor. La nevoie, acestea pot fi apelate  din interfata SQL *PLUS cu ajutorul comenzii EXECUTE:

EXECUTE nume_procedura(arg1, arg2, ..)

Localizarea subprogramelor

• subprogramele pot fi  stocate in dictionarul de  date (in forma de cod obiect- numit si p-cod) sau in sectiunea declarativa a unui bloc (caz in care se numesc  subprograme locale)
• informatii referitoare la acestea se gasesc in : user_objects, user_source, user_errors

Proceduri/Functii si  dependente
• Procedurile/functiile sunt dependente de un tabel daca acceseaza  tabelul respectiv. Aceasta inseamna  ca  daca structura tabelului  este modificata  toate proceurile respectiv toate functiile dependente  trebuie sa fie  recompilate  prin utilizarea comenzii  ALTER.

Comenzi corespunzatoare procedurilor si functiilor
Recompilarea unei proceduri:
ALTER PROCEDURE nume_proc COMPILE

Eliminarea unei  proceduri/functii:
DROP PROCEDURE nume_proc;
DROP FUNCTION nume_function;

Pentru a  permite  unui user sa execute o  procedura :
GRANT EXECUTE ON nume_proc TO nume_user;