PL-SQL PROCEDURE

PL/SQL Block Structure

Bir anonymous PL/SQL block yukarıda belirtildiği gibi isteğe (ihtiyaca) bağlı olarak DECLARE bölümü, zorunlu olarak BEGIN ve END Blokları arasında çalıştırılacak kodlarımız olur, eğer hata yakalama işlemi yapılacaksa EXCEPTION kısmı olacaktır.

Bir anonymous PL/SQL block yukarıda belirtildiği gibi isteğe (ihtiyaca) bağlı olarak DECLARE bölümü, zorunlu olarak BEGIN ve END Blokları arasında çalıştırılacak kodlarımız olur, eğer hata yakalama işlemi yapılacaksa EXCEPTION kısmı olacaktır.

Bir Stored Program ise zorunlu olarak bir header kısmı içermelidir (function, procedure, package vs.. olduğu tanımlanır).

Bir Plsql blogu tek ayrı yarı veya iç içe geçmiş Plsql bloklarından oluşabilir.

Procedures

Procedure parametre alabilen adlandırılmış bir Pl-Sql bloğudur. Bir prosedür derlenir ve veritabanında bir nesne olarak saklanır, yeniden kullanılabilir.

Prametrelerin mode kısmı IN, OUT ve IN OUT olabilir

  • IN: Programımıza bir değer gönderir.
  • OUT: Programamızda belirtiğimiz değeri döndürür.
  • IN OUT: Programımıza bir değer gönderir ve aynı zamanda bu değişkenin değişerek geri dönme ihtimali olduğunu gösterir.

NOT: Procedure parametre alabilen fakat geriye bir değer return edemeyen alt programdır, geriye değer return edebilen alt program Fonksiyondur. IN OUT geriye değer döndürü gibi görünsede bir prosedurü bir değişkene eşitleyemezsiniz.


create or replace procedure test123
(p_a in number, p_b  number )
is
    v_a number:=p_a;
    v_b number;
    v_c number;
begin
      v_b:=p_b;
      v_c:=v_a+v_b;
    
    dbms_output.put_line(v_a||' + '||v_b||' toplam ' || v_c );
end;

proceduru çalıştırmak için

begin
    test123(5,3);
end;

PL-SQL İSİMLENDİRME

Handled Exceptions

CREATE PROCEDURE add_department(
    p_name VARCHAR2, p_mgr NUMBER, p_loc NUMBER) IS
BEGIN
    INSERT INTO DEPARTMENTS (department_id,
    department_name, manager_id, location_id)
    VALUES (DEPARTMENTS_SEQ.NEXTVAL, p_name, p_mgr, p_loc);
    DBMS_OUTPUT.PUT_LINE('Added Dept: '|| p_name);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Err: adding dept: '|| p_name);
END;

begin
    add_department('Media', 100, 1800);
    add_department('Editing', 99, 1800);
    add_department('Advertising', 101, 1800);
end;

Çıktı

Added Dept: Media
Err: adding dept: Editing
Added Dept: Advertising

Editing kısmnı eklerken hata verdi, Manager_id 99 olan manager_id mevcut değil ve foreign key constraint içeriyor. Fakat hata aldımız halde procedure durmadı ve alt satırdaki Advertising kısmını departments tablosuna ekledi. Exception yakalanmazsa; Exception oluştuğunda hata oluşur ve prosedure sona erer.

Data Dictionary den Procedure Bilgilerini sorgulamak için;

DESCRIBE user_source ;

SQL> describe user_source;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NAME                                               VARCHAR2(128)
 TYPE                                               VARCHAR2(12)
 LINE                                               NUMBER
 TEXT                                               VARCHAR2(4000)
 ORIGIN_CON_ID                                      NUMBER

SQL> select TEXT from user_source;

TEXT
--------------------------------------------------------------------------------
PROCEDURE add_department(
    p_name VARCHAR2, p_mgr NUMBER, p_loc NUMBER) IS
BEGIN
    INSERT INTO DEPARTMENTS (department_id,
    department_name, manager_id, location_id)
    VALUES (DEPARTMENTS_SEQ.NEXTVAL, p_name, p_mgr, p_loc);
    DBMS_OUTPUT.PUT_LINE('Added Dept: '|| p_name);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Err: adding dept: '|| p_name);
END;

TEXT
--------------------------------------------------------------------------------
PROCEDURE add_job_history
  (  p_emp_id          job_history.employee_id%type
   , p_start_date      job_history.start_date%type
   , p_end_date        job_history.end_date%type
   , p_job_id          job_history.job_id%type
   , p_department_id   job_history.department_id%type
   )
IS
BEGIN
  INSERT INTO job_history (employee_id, start_date, end_date,
                           job_id, department_id)

.
. vs