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
Bir yanıt yazın