Download as pdf or txt
Download as pdf or txt
You are on page 1of 68

H..

Bilgisayar Mhendislii
1 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
2 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
3 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Kullanm alanlar
1. kurallarnn sakl yordam olarak barndrlmas : Yaplacak bir birim i,
birden ok tabloya ekleme veya gnleme ilemi ieriyor olabilir, ya da bir
sorgunun sonucuna gre yaplacak ileme karar verilebilecei gibi, sorgudan
alnacak parametrelerle ekleme ya da gnleme yaplabilir. Bu gibi durumlarda,
normal mantk ile, veri taban birden ok kere sorgulanmaldr. Yaplacak birim i
iin, veri tabanna birden ok balant kurulmas gerekecektir. Bu gibi durumlar
PL/SQL k ll l k l l bili Y l k t k bi b l t il il ili PL/SQL kullanlarak ele alnabilir. Yaplmas gereken, tek bir balant ile ilgili
PL/SQL yordamnn arlmasdr.
2. Veri taban olaylarnn tetiklenmesi : SEQUENCE ekleme ileminde direk
kullanlmas veya yabancl anahtar kstnn yetmedii durumlarda kstlarn
oluturulmas gibi amalarla kullanlabilirler.
4 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
5 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
6 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Anonymous :
simsiz.
inline tanmlanr.
Uygulama alma zaman derlenir, yazldklar yerde
iletilirler. Uygulamann her altrlnda yeniden
derlenir.
Veri tabannda saklanmazlar / depolanmazlar Veri tabannda saklanmazlar / depolanmazlar.
Ayn bloun bakaca bir yerde altrlmas iin, ayn
kodun oraya da kopyalanmas gerekir. Zira altktan
sonra yok olurlar.
Subprograms
simleri ile gereken yerden arlabilirler.
Veri tabannda depolanrlar.
Her defasnda yeniden derlenmezler.
7 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
----------------------------------------------------------------------------------------------
/*
Uzun aklama satr
*/
SET SERVEROUTPUT ON
-- Aklama satr
DECLARE
vc_ISIM VARCHAR(20);
BEGIN
select ISIM into vc_ISIM from FIRMA where FIRMA_PK = 5;
DBMS_OUTPUT.PUT_LINE('5 nolu firmann ad : ' || vc_ISIM);
END;
----------------------------------------------------------------------------------------------
Ekrana kt yazdrma ilevinin SQL*Plus komutu olmas sebebiyle, bu kodu
SQL*Pl k ll k kl dik
8
SQL*Plus kullanarak rnekledik.
Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
9 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
10 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
11 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
lgili kolona iliikin veri taban kstlar yeni tanmlanan deikene uyarlanmaz.
rnein, NOT NULL olarak belirlenmi bir kolondan %TYPE ilecini kullanarak
retilen bir deikene NULL aktarlabilir.
----------------------------------------------------------------------------------------------
SET SERVEROUTPUT ON
DECLARE DECLARE
vc_ISIM FIRMA.ISIM%TYPE;
BEGIN
select ISIM into vc_ISIM from FIRMA where FIRMA_PK = 5;
DBMS_OUTPUT.PUT_LINE('5 nolu firmann ad : ' || vc_ISIM);
END; END;
---------------------------------------------------------------------------------------------
12 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Derleme hatas olmakszn, firma tablosundaki tm satrlar silinecektir.
13 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
SET SERVEROUTPUT ON
DECLARE
today DATE:=SYSDATE;
tomorrow today%TYPE;
BEGIN
tomorrow:=today +1;
DBMS_OUTPUT.PUT_LINE(' Hello World ');
DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| today);
DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || tomorrow);
END;
14 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
DDL Data Definition Language CREATE TABLE, ALTER
TABLE, vs
DCL Data Control Language GRANT, REVOKE
15 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Birden ok satrn ele alnmas gerektii durumlarda ileride bahsedilecek olan
explicit cursor yaps kullanlmaldr.
16 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
17 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
----------------------------------------------------------------------------------------------
DECLARE DECLARE
empno EMPLOYEES.EMPLOYEE_ID%TYPE := 100;
BEGIN
MERGE INTO copy_emp c
USING employees e
ON (e.employee_id = empno)
WHEN MATCHED THEN
UPDATE SET UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c salary = e salary c.salary = e.salary,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e salary e commission pct e manager id
18
e.salary, e.commission_pct, e.manager_id,
e.department_id);
END;
----------------------------------------------------------------------------------------------
Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
SET SERVEROUTPUT ON
DECLARE DECLARE
empno employees.employee_id%TYPE :=110;
fname employees.first_name%TYPE ;
lname employees.last_name%TYPE ;
emp_sal employees.salary%TYPE ;
emp_number PLS_INTEGER;
avg_salary employees.salary%TYPE;
BEGIN
SELECT first_name, last_name, salary INTO fname, lname, emp_sal
FROM employees WHERE employee_id=empno;
DBMS_OUTPUT.PUT_LINE('Name: ' || fname || ' Soyad: ' || lname || ' Maa: ' || emp_sal);
UPDATE employees SET
first_name = 'Fatihq',
last_name = 'GLE',
salary = 1000 salary = 1000
WHERE
employee_id = empno;
DBMS_OUTPUT.PUT_LINE('After update...');
SELECT first_name, last_name, salary INTO fname, lname, emp_sal
FROM employees WHERE employee_id=empno;
DBMS OUTPUT PUT LINE('Name: ' || fname || ' Soyad: ' || lname || ' Maa: ' || emp sal);
19
DBMS_OUTPUT.PUT_LINE( Name: || fname || Soyad: || lname || Maa: || emp_sal);
Select COUNT(*), AVG(salary) INTO emp_number, avg_salary from employees
where manager_id IN (select manager_id from employees where employee_id =
110);
DBMS_OUTPUT.PUT_LINE(' Personel says: ' || emp_number || ' Ortalama maa: ' || avg_salary);
END;
Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
----------------------------------------------------------------------------------------------
DECLARE
myage number:=31;
BEGIN
IF myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSIF myage < 20 y g
THEN
DBMS_OUTPUT.PUT_LINE(' I am young ');
ELSIF myage < 30
THEN
DBMS_OUTPUT.PUT_LINE(' I am in my twenties');
ELSIF myage < 40
THEN THEN
DBMS_OUTPUT.PUT_LINE(' I am in my thirties');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am always young ');
END IF;
END;
----------------------------------------------------------------------------------------------
20 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
a := NULL;
b := NULL;

IF a = b THEN -- sonu NULL olur, TRUE deil!


-- bu kesim asla iletilmeyecektir.
END IF;
21 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Dikkat :
OR ifadesinde en az bir tane TRUE varsa, dier deerlere baklmakszn (NULL
dahi olsa) sonu TRUE olur.
AND ifadesinde en az bir tane FALSE varsa, dier deerlere baklmakszn (NULL
dahi olsa) sonu FALSE olur.
22 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Buraya rnek kod gelmeli
23 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
24 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Saya, sadece birer birer artar veya azalr.
----------------------------------------------------------------------------------------------
FOR i IN 3..3 LOOP
statement1;
END LOOP;
----------------------------------------------------------------------------------------------
Yukardaki dngde statement1 ifadesi sadece bir kere iletilecektir.
25 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
26 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
27 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
UNDEFINE EMPNO
UNDEFINE SURNAME UNDEFINE SURNAME
SET SERVEROUTPUT ON
SET VERIFY OFF
DECLARE
fname employees.first_name%TYPE ;
lname employees.last_name%TYPE ;
emp_sal employees.salary%TYPE ;
new_emp_sal employees.salary%TYPE ;
BEGIN
SELECT first_name, last_name, salary INTO fname, lname, emp_sal
FROM employees WHERE employee_id=&&EMPNO;
IF(LOWER(lname)=LOWER('&&SURNAME')) THEN
DBMS_OUTPUT.PUT_LINE('Maanz: ' || emp_sal);
FOR i IN 1..12 LOOP
emp sal := emp sal * 1 01; emp_sal := emp_sal 1.01;
DBMS_OUTPUT.PUT_LINE(i||'. ay Maanz: ' || emp_sal);
END LOOP;
ELSE
DBMS_OUTPUT.PUT_LINE('Yaln kullanc ad veya parola');
END IF;
END;
28 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
29 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Tablonun bir satrnn ilenmesi amal deikene aktarlmas gerektii durumlarda,
tanmlanacak deiken PL/SQL Record trnde olmaldr. PL/SQL Record
verisinde, birden ok scalar veri saklanabilir. Genel olarak programlama dillerindeki
yaplara (struct) benzetilebilir. ie gemi record yaplar oluturulabilir. rnein,
yabancl anahtarla (foreign key) ile bakaca bir tablonun satrna referans gsteren
bir satrn record yaps referans gsterebilecei gibi istenilirse ilgili dier satr da
dorudan saklayabilir.
30 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
31 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
32 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
DEFINE employee_number = 124
DECLARE
emp_rec employees%ROWTYPE;
BEGIN
SELECT * INTO emp_rec FROM employees
WHERE employee_id = &employee_number;
INSERT INTO ti d ( j b INSERT INTO retired_emps(empno, ename, job, mgr,
hiredate, leavedate, sal, comm, deptno)
VALUES (emp_rec.employee_id, emp_rec.last_name,
emp_rec.job_id,emp_rec.manager_id,
emp_rec.hire_date, SYSDATE, emp_rec.salary,
emp_rec.commission_pct, emp_rec.department_id);
END;
33 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
34 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
35 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
CREATE TABLE zam_emp(
employee id NUMBER(6) employee_id NUMBER(6),
first_name VARCHAR(20),
last_name VARCHAR(20),
salary NUMBER(8,2)
);
--------------------------------------------------------------------------------------------
SET SERVEROUTPUT ON
SET VERIFY ON SET VERIFY ON
UNDEFINE ID
UNDEFINE ZAM
DECLARE DECLARE
emp_rec employees%ROWTYPE;
BEGIN
SELECT * INTO emp_rec FROM employees
WHERE employee_id = &ID;
36
emp_rec.salary := emp_rec.salary * &ZAM;
INSERT INTO zam_emp(EMPLOYEE_ID,
FIRST_NAME, LAST_NAME, SALARY)
VALUES (emp rec.employee id,
Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
37 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
38 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
PLS_INTEGER deer aral -2147483647 2147483647 dir. Dolaysyla anahtar
olarak verilen deer 0 ya da 1 den balamak zorunda deildir.
39 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
40 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Syntax: table_name.method_name[ (parameters) ]
PRIOR ve NEXT kullanm, anahtar deerlerin sral ve dzgn dalmad durumlarda ok nemlidir.
Method Description
EXISTS(n)
Returns TRUE if the nth element in a PL/SQL table exists
COUNT Returns the number of elements that a PL/SQL table currently
contains
FIRST R t th fi t dl t ( ll t dl t) i d b i FIRST
LAST
Returns the first and last (smallest and largest) index numbers in a
PL/SQL table. Returns NULL if the PL/SQL table is empty
PRIOR(n) Returns the index number that precedes index n in a PL/SQL table
NEXT(n) Returns the index number that succeeds index n in a PL/SQL table
DELETE
DELETE removes all elements from a PL/SQL table.
DELETE(n) removes the nth element from a PL/SQL table.
DELETE(m, n) removes all elements in the range m ... n from a g
PL/SQL table.

41 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
42 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
43 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
SET SERVEROUTPUT ON
DECLARE DECLARE
TYPE dept_table_type IS TABLE OF departments.department_name%TYPE INDEX BY PLS_INTEGER;
my_dept_table dept_table_type;
loop_count NUMBER (2):=10;
deptno NUMBER (4):=0;
BEGIN
FOR i IN 1..loop_count
LOOP
deptno:=deptno+10; deptno:=deptno+10;
SELECT department_name INTO my_dept_table(i) FROM departments WHERE department_id =
deptno;
END LOOP;
FOR i IN 1..loop_count
LOOP
DBMS_OUTPUT.PUT_LINE (my_dept_table(i));
END LOOP;
END;
----------------------------------------------------------------------------------------------------------------------
SET SERVEROUTPUT ON
DECLARE
TYPE dept_table_type is table of departments%ROWTYPE INDEX BY PLS_INTEGER;
my dept table dept table type;
44
my_dept_table dept_table_type;
loop_count NUMBER (2):=10;
deptno NUMBER (4):=0;
BEGIN
FOR i IN 1..loop_count
LOOP
deptno := deptno + 10;
SELECT *INTO my_dept_table(i) FROM departments WHERE department_id = deptno;
END LOOP;
Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
45 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
46 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
47 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
48 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
49 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
PL/SQL SELECT sorgularnda INTO kesiminin olmas zorunludur. Ancak imle
ilemlerinde kullanlan SELECT sorgularnda INTO kesiminin bulunmasna izin
verilmez. INTO kesiminin bulunmas mantna aykrdr, zira fetch kesiminde elde
edilen veri ilgili deikenlere aktarlabilir.
50 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
51 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
52 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
53 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
54 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
55 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
56 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
57 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
SET SERVEROUTPUT ON
DECLARE DECLARE
CURSOR dept_cursor IS
SELECT department_id,department_name FROM departments
WHERE department_id < 100
ORDER BY department_id;
CURSOR emp_cursor(v_deptno NUMBER) IS
SELECT last_name,job_id,hire_date,salary FROM employees
WHERE department_id =
v deptno AND employee id < 120; _ p p y _ ;
current_deptno departments.department_id%TYPE;
current_dname departments.department_name%TYPE;
ename employees.last_name%TYPE;
job employees.job_id%TYPE;
hiredate employees.hire_date%TYPE;
sal employees.salary%TYPE;
BEGIN
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO current_deptno,current_dname;
EXIT WHEN dept_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ('Department Number : ' || current_deptno || '
Department Name : ' || current_dname);
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
58
END IF;
OPEN emp_cursor (current_deptno);
LOOP
FETCH emp_cursor INTO ename,job,hiredate,sal;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (ename || ' ' || job || ' ' || hiredate || ' ' || sal);
END LOOP;
Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
Yantmce : clause
59 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
60 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
61 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
62 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
63 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
procedure_body ve function_body Anonymous bloklardan farkl deildir.
64 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
65 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
66 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
67 Fatih Mehmet GLE
H.. Bilgisayar Mhendislii
CREATE OR REPLACE TRIGGER tarih_kontrol_bef_del BEFORE DELETE ON
table1
DECLARE
weekend_error EXCEPTION;
BEGIN
IF TO_CHAR(SYSDATE, DY) = SAT OR TO_CHAR(SYSDATE,
DY) = SUN DY ) = SUN
THEN
RAISE weekend_error;
END IF;
EXCEPTION
WHEN weekend error THEN WHEN weekend_error THEN
RAISE_APPLICATION_ERROR (-20001, Haftasonu
gnlerinden silme yapamazsnz!);
END;
68 Fatih Mehmet GLE

You might also like