Menu

PL/SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
PL/SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

25 Mayıs 2011 Çarşamba

dbms_output.put_line kisa formasi

Ozelliklede PL/SQL`de console biseyler yazdirmak icin, DBMS_OUTPUT.PUT_LINE(); gibi uzun bi kod yazmamiz gerekiyor, ancak bu yolu yeni bir procedure yazarak asabiliriz.. Hemde cok basit bir sekilde...

CREATE OR REPLACE PROCEDURE yaz(
 cn_text IN VARCHAR2 )
 IS
BEGIN
    SYS.DBMS_OUTPUT.PUT_LINE(cn_text);
END yaz;

kullanimi : 

BEGIN
     yaz('Hello World');
END;


SQL: ALTER TABLE Statement

ALTER TABLE deyimi, tabloyu yeniden adlandirma, colon ekleme, silme, degistirmek icin kullanilir. Asagida, ALTER TABLE deyimi ile birlikte neler yapabiliriz onlari gorelim.

Temel olarak bir tablonun adini degistirmek:
ALTER TABLE table_name RENAME TO new_table_name;
Ornek :
ALTER TABLE students RENAME TO ogrenciler;

Tabloya kolon(lar) ekleme :
ALTER TABLE table_name  ADD column_name column-definition;
Ornek :
ALTER TABLE student  ADD email varchar2(50);

Kolonlar ekleme :

ALTER TABLE table_name
ADD ( column_1 column-definition,
column_2 column-definition,
...
column_n column_definition );

Ornek :

ALTER TABLE student
ADD ( first_name varchar2(50),
city varchar2(45) );


Kolon bilgilerini degistirme :
ALTER TABLE table_name  MODIFY column_name column_type;
Ornek :
ALTER TABLE students  MODIFY email varchar2(100) not null;

Kolon Silme :
ALTER TABLE table_name  DROP COLUMN column_name;

Ornek :
ALTER TABLE students  DROP email ;

Kolon Ismini degistirme :
ALTER TABLE table_name  RENAME COLUMN old_name to new_name;
 Ornek : 
 ALTER TABLE students  RENAME COLUMN email to mail_address;

Practice Exercise #1:
Asagidaki departments tablosunun ismini degistirin.
CREATE TABLE departments
( department_id number(10) not null,
department_name varchar2(50) not null,
CONSTRAINT departments_pk PRIMARY KEY (department_id)
);


Solution:
ALTER TABLE departments
 RENAME TO depts;

Practice Exercise #2:
Asagidaki Employees tablosuna, ismini salary, datatype number(6) olan bir kolon ekleyin.
CREATE TABLE employees
( employee_number number(10) not null,
employee_name varchar2(50) not null,
department_id number(10),
CONSTRAINT employees_pk PRIMARY KEY (employee_number)
);


Solution:
            
ALTER TABLE employees ADD salary number(6);

Practice Exercise #3:
Asagidaki Customers tablosuna, contact_name isminde ve varchar2(50) tipinde ve last_contancted isminde ve tarih tipinde colonlar ekleyin.
CREATE TABLE customers
( customer_id number(10) not null,
customer_name varchar2(50) not null,
address varchar2(50),
city varchar2(50),
state varchar2(25),
zip_code varchar2(10),
CONSTRAINT customers_pk PRIMARY KEY (customer_id)
);


Solution:
ALTER TABLE customers
ADD ( contact_name varchar2(50),
last_contacted date );

Practice Exercise #4:
Employees tablosunda employee_name kolonun datatipini, 75 yapiniz.
CREATE TABLE employees
( employee_number number(10) not null,
employee_name varchar2(50) not null,
department_id number(10),
CONSTRAINT employees_pk PRIMARY KEY (employee_number)
);


Solution:
ALTER TABLE employees
 MODIFY employee_name varchar2(75);

Practice Exercise #5:
change the customer_name column to NOT allow null values and change the state column to a varchar2(2) datatype.
CREATE TABLE customers
( customer_id number(10) not null,
customer_name varchar2(50),
address varchar2(50),
city varchar2(50),
state varchar2(25),
zip_code varchar2(10),
CONSTRAINT customers_pk PRIMARY KEY (customer_id)
);


Solution:
ALTER TABLE customers
MODIFY ( customer_name varchar2(50) not null,
state varchar2(2) );

Practice Exercise #6:
Asagidaki tablodaki salary kolonunu siliniz.
CREATE TABLE employees
( employee_number number(10) not null,
employee_name varchar2(50) not null,
department_id number(10),
salary number(6),
CONSTRAINT employees_pk PRIMARY KEY (employee_number)
);


Solution:
ALTER TABLE employees  DROP COLUMN salary;

Practice Exercise #7:
Asagiadki tablodaki department_name kolonunun ismini, dept_name ile degistirin.
CREATE TABLE departments
( department_id number(10) not null,
department_name varchar2(50) not null,
CONSTRAINT departments_pk PRIMARY KEY (department_id)
);


Solution:
ALTER TABLE departments
 RENAME COLUMN department_name to dept_name;

12 Eylül 2010 Pazar

Cok sutunlu altsorgular

Altsorgunun SELECT kisminda birden fazla sutun yer aliyorsa bunlara cok sutunlu alt sorgular denir. Cok sutunlu alt sorugular  genelde sutunlarin karsilastirilmasinda kullanilir yada UPDATE  cumlelerinde kullanilir.

Asagidaki sorgudaki her departmende en yuksek maasi alan employee listelenmistir..

select concat(first_name,' '|| last_name) AS fullname, salary, department_id from employees
    WHERE (department_id, salary) IN
          (SELECT department_id, max(salary)
              FROM employees GROUP BY department_id)
    ORDER BY salary DESC


FULLNAME                                       SALARY                 DEPARTMENT_ID         
---------------------------------------------- ---------------------- ----------------------
Steven King                                          31944                  90                    
John Russell                                          18634                  80                    
Nancy Greenberg                                 15982.65               100                   
Shelley Higgins                                     15982.65               110                   
Den Raphaely                                      14641                  30                    
Hermann Baer                                     13310                  70                    
Alexander Hunold                               11979                  60                    
Adam Fripp                                        10914.2                50                    
Susan Mavris                                      8651.5                 40                    
Pat Fay                                              7986                   20                    
Jennifer Whalen                                  5856.4                 10                    

11 rows selected

AVG

AVG(DISTINCT|ALL
) fonksiyonunda p sayisal bir ifadedir. AVG fonksiyonu aritmetik ortalamayi verir. Eger DISTINCT yada ALL kullanilmaz ise varsayilan degeri ALL`dir.

SELECT department_id, AVG(salary) FROM employees
      GROUP BY department_id
      ORDER BY AVG(salary)



DEPARTMENT_ID          AVG(SALARY)           
---------------------- ----------------------
50                     4625.964444444444444444444444444444444444
30                     5523.65               
10                     5856.4                
60                     7666.56               
20                     7986                  
40                     8651.5                
                          9317                  
100                    11448.375             
80                     11920.2794117647058823529411764705882353
70                     13310                 
110                    13514.975             
90                     25732.6666666666666666666666666666666667

12 rows selected

Karakter Fonksiyonlari

Karakter degerleri uzerinde islem yapar. Bir cogu bir veya birden fazla karakter veri tipinde paremetre alir ve karakter yada sayisal veri tipinde deger dondurur.
Karakter fonksiyonlarini 2 gruba ayirmak mumkundur.
  • Buyuk kucuk harf donusum fonksiyonlari
             (LOWER, UPPER, INITCAP)
  • Karakter isleme fonksiyonlari
            (SUBSTR, CHR, CONCAT, INSTR, LENGTH ...)

Asagida en cok kullaninalan karekter fonksiyonlarini ogrenelim..

CONCAT
Bu fonksiyon iki parametre alir ve sonuc olarak ikinci dizgeyi birinci dizgeye eklenmis olarak dondurur.
1 .
      SELECT CONCAT('Ertugrul','Aslan') FROM dual;

      DONEN_DEGER  
      -------------
     ErtugrulAslan 

2.
     SELECT CONCAT('Ertugrul',' Aslan') FROM dual;
 
     DONEN_DEGER  
     ------------- 
     Ertugrul Aslan  

3.
     SELECT concat(first_name, last_name) FROM employees where email ='JWHALEN'
 
     DONEN_DEGER  
     ------------- 
     JenniferWhalen  

4.
     SELECT concat(first_name, ' '||last_name) FROM employees where email ='JWHALEN'
 
     DONEN_DEGER  
     ------------- 
     
Jennifer Whalen 


SUBSTR 
SUBSTR(,[,]) fonksiyonu bi karakter dizgesi k1 icerisinde m`inci pozisyondan  baslayarak dizgenin sonuna kadar yada eger belirtilmisse n`inci pozisyona kadar olan dizgeyi dondurur.
1.
     SELECT substr('Ben ve Oracle', 1, 11) FROM dual;
 
     DONEN_DEGER  
     ------------- 
     
Ben ve Orac
 
2.
     SELECT substr('Ben ve Oracle', 1, 11) FROM dual;
 
     DONEN_DEGER  
     ------------- 
     
Ben ve Orac

3.
     SELECT substr('Ben ve Oracle', 1, 13) FROM dual;
 
     DONEN_DEGER  
     ------------- 
     
Ben ve Oracle

4.
     SELECT substr('Ben ve Oracle', 1, 30) FROM dual;
 
     DONEN_DEGER  
     ------------- 
     
Ben ve Oracle


 LENGTH
 LENGTH() fonksiyonu ilgili karakter dizgesinin uzunlugunu dondurur.
1.
     SELECT length('Ben ve Oracle') FROM dual;
 
     DONEN_DEGER  
     ------------- 
     
13
 
2.
     SELECT length('') FROM dual;
 
     DONEN_DEGER  
     ------------- 
      (Null)

 INSTR
INSTR(,,[i[,j]]) fonksiyonu dort paremetre alir. k1 ve k2 karakter dizgeleri, i ve j tamsayidir. Bu fonksiyon k1 icerisinde k2`nin j`inci tekrarinin sayisal pozisyonu dondurur. Arama islemi i`ininci degerder baslar. Eger i`ye negatif bir deger girilirse arama tersten yapilir yani sagdan sola dogru ancak pozisyon yine saga dogru sayilir. I ve j`nin varsayilan degerleri 1`dir.
1.
     SELECT instr('Ertugrul', 'g',1,1) FROM dual;
 
     DONEN_DEGER  
     ------------- 
      5
 
2.
     SELECT instr('Ertugrul', 'g',1,2) FROM dual;
 
     DONEN_DEGER  
     ------------- 
      0
 
3.
     SELECT instr('Ertugrul', 'u',1,1) FROM dual;
 
     DONEN_DEGER  
     ------------- 
     4

4.
     SELECT instr('Ertugrul', 'u',1,2) FROM dual;
 
     DONEN_DEGER  
     ------------- 
      7

5.
     SELECT instr('Ertugrul', 'g',-1,1) FROM dual;
 
     DONEN_DEGER  
     -------------       
      5


LPAD ve RPAD
LPAD(k,i, k2) fonksiyonu 3 parametre alir. k1 ve k2 karakter veritipindendir ve i tamsayidir.Bu fonksiyon k1 karakterinin basina  toplam dizge uzunlugu i oluncaya kadar k2 karakterinden koyar. Eger k1`in uzunlugu i degerininde buyuk ise k1 uzunlugu i olana kadar kesilir. RPAD(k1,i,k2) fonksiyonu ise bu islemi k1`in sonunda yapar

1.
     SELECT lpad('Ertugrul', 15,'+') FROM dual;
 
     DONEN_DEGER  
     -------------       
      +++++++Ertugrul

2.
     SELECT rpad('Ertugrul', 20,'+') FROM dual;
 
     DONEN_DEGER  
     -------------       
      Ertugrul++++++++++++ 

TRIM
TRIM(k1,k2 FROM k3) fonksiyonu uc parametre alir. k2 ve k3 karakter dizgeleridir. k1 asagidakilerden biri olabilir. LEADING, TRAILING, BOTH. Bu fonksiyon secilen k1 degerine gore k3 icerisindeki k2 karakter dizgeleri cikartilmis olarak k3 dizgesini dondurur.
1.
    SELECT TRIM('  Ertugrul.  Aslan  ') test1,
       TRIM('Ertugrul.  Aslan  ') test2,
       TRIM('  Ertugrul.  Aslan') test3
    FROM DUAL;
 
     DONEN_DEGER  
     -------------       
      Ertugrul.  Aslan Ertugrul.  Aslan Ertugrul.  Aslan 


REPLACE
REPLACE(k1,k2,k3) fonksiyonu 3 parametre alir. k1,k2 ve k3 karakter dizgeleridir. Bu fonksiyon k1 icerisinde tum k2`leri k3 ile degistirir. k32nin varsayilan degeri NULL`dur. Eger k3 null olursa k1 icerisindeki tum k2`ler cikarili. Eger k2 NULL olursa k1 degismeden aynen doner. Eger k1 NULL olursa NULL doner.
1.
    SELECT replace('Ertugrul','ul','a') FROM DUAL;
 
     DONEN_DEGER  
     -------------       
      Ertugra


LOWER-UPPER-INITCAP
LOWER(k1) fonksiyonu karakter dizgesi bir parametre alir. Bu fonksiyon parametre olarak verilen karakter dizgesinin tum harflerini kucuk harfer, UPPER, buyuk harfe, INITCAP, ilk harfini buyuk harfe digerlerini kucuk harfe cevirir.
1.
    SELECT lower('eRtUGrUL') LOWER_TEST, upper('eRtUGrUL') UPPER_TEST,     initcap('eRtUGrUL') INITCAP_TEST FROM DUAL;
 
LOWER_TEST   UPPER_TEST    INITCAP_TEST
---------------     ----------------    ------------
ertugrul          ERTUGRUL       Ertugrul 




Sayisal Fonksiyonlar

Sayisal fonksiyonlar sayisal degerler uzerinde bir kisim matematiksel yada aritmetik islem yaparlar. Tum parametleri sayisal degerlerdir ve tum fonksiyonlar deger dondurur. Trigonometrik fonksiyonlar dereceler uzerinde degil, radian degerler uzerinde calisir.

            ABS          Mutlak degeri dondurur       

            ACOS       Arc-kosinus degerini dondurur.

            ASIN        Arc-sinus degerini dondurur.      
 
            CEIL         Sayiyi bi ust tamsayi degerine yuvarlar     
  
            COS         Cosinus degerini dondurur.           

            FLOOR    Sayiyi bi alt tamsayi degerine dondurur.

            MOD        Sayinin modunu dondurur. Yani bolmeden kalani     
  
            POWER    Sayinin ussel degerini verir. Yani a(b) nin degerini verir.  
 
            ROUND    Sayiyi yuvarlar       

            SQRT        Sayinin karakokunu verir.           

            TRUNC    Sayinin belirtilen kismini keser.

Ornekler

1.
      SELECT ROUND(12345, -3) test1, round(12345.54321, 3) test2 FROM dual
       TEST1                  TEST2                 
      ----------              --------------
       12000                  12345.543     

2.
      SELECT trunc(1234.567, 1) test1, trunc(1234.567, -2) test2 FROM dual
       TEST1                  TEST2                 
      -------------       ----------------------
       1234.5                 1200     

3.
      SELECT ceil(8.7) test1, ceil(-34.89) test2, floor(8.7) test3, floor(-34.89) test4 FROM dual
TEST1             TEST2            TEST3               TEST4                
---------         -----------       -----------       ---------------
9                      -34                    8                      -35    

4.
      SELECT mod(19, 5) test1, mod(9, 2.5) test2, mod(-55, 6) test3 FROM dual
       TEST1            TEST2         TEST3                 
     ---------         ---------       ----------
         4                    1.5               -1

Sql Fundamental

26 Ocak 2009 Pazartesi

Trigger kullanimi

Trigger - her hangi bir DML ve ya DDL emrleri calistiqinda calisan program kodudur. Bunu asagidaki basit bir ornekle gosterebiliriz..
Mesela bir table-imiz var, o table-a insert, update, delete eden user-lerin istifadeci adlarini, host-unu ve bu emri icra etdiyi tarihi control edib diger bir "log" table-ina yazmamiz lazim.

Boyle bir orneye bakalim

CREATE TABLE tbl_trigger_test (ID NUMBER, adi VARCHAR2(20))
/
CREATE TABLE tbl_log_trigger_test (username VARCHAR2(20), tarih DATE, host VARCHAR2(20), emeliyyat VARCHAR2(20))
/
INSERT INTO tbl_trigger_test
VALUES (1, 'Ertugrul')
/
COMMIT
/
CREATE OR REPLACE TRIGGER trg_trigger_test
BEFORE INSERT OR UPDATE OR DELETE
ON tbl_trigger_test
DECLARE
v_islem VARCHAR2 (20);
BEGIN
IF INSERTING
THEN
v_islem := 'INSERT';
ELSIF UPDATING
THEN
v_islem := 'UPDATE';
ELSIF DELETING
THEN
v_islem := 'DELETE';
END IF;

INSERT INTO tbl_log_trigger_test
VALUES (USER, SYSDATE, SYS_CONTEXT ('USERENV', 'HOST),
v_islem);
END;
Simdi, her defa tbl_trigger_test tablomuza INSERT, UPDATE, DELETE emrlerini uyqulasak, o zaman tbl_log_trigger_test tablomuz bir row eklenecekdir

SQL>SELECT * FROM tbl_log_trigger_test;
no rows selected

Log tablosunun ici bos. Simdi esas tabloya bazi satirlar ilave edib silelim, bakalim log-a alinicakmi?
SQL> insert into tbl_trigger_test values(2,'Asalan');

1 row created.

SQL> update tbl_trigger_test set id=0 where id=1;

1 row updated.

SQL> delete from tbl_trigger_test where id=0;

1 row deleted.

SQL>select * from tbl_log_trigger_test;
Ertugrul 24-JAN-2009 15:13:09 localhost INSERT
Ertugrul 24-JAN-2009 15:13:25 localhost UPDATE
Ertugrul 24-JAN-2009 15:13:49 localhost DELETE

10 Aralık 2008 Çarşamba

Exception Handling (Hata Yakalama)

Her programlama dilinde oldugu gibi Oracle ‘ın prosedürel veritabanı programlama dili olan PL/SQL de de gerek derleme sırasında(compile time), gerekse programın çalışması esnasında(run time) hata durumu ortaya çıkabilir.Bu yazıda bunların tespit edip yakalama ve program akışını buna göre düzenlemeye yönelik kısa bilgiler bulacaksınız.

PL/SQL de işlemi gercekleştirecek kod parcacıkları fonksiyon, procedür ya da script seklinde bir kod blogu ile olabilir.Hepsinin ortak yanı :


declare
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end;

şeklinde bir bloktan oluşmalarıdır.NOT : Fonksiyon ve prosedür için örnekler şu şeklide verilebilir :


Fonksiyon örneği :
function fonksiyonXXX(param1 varchar2,param2 number….) return aDataType is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
return aDataType;
end fonksiyonXXX;

Procedür örneği :
procedure procedurXXX (param1 varchar2,param2 number….) is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end prosedurXXX;

Türü ne olursa olsun hata yönetimi yapmak, hatayı yakalamak için her begin-end; bloğu arasında bu blokta olusacak hata için “exception” anahtar kelimesi kullanılmalıdır.

declare
begin
….
…..
….
…
exception
………………
end;

“exception” kısmında “end;” sonuna kadar olan kısımda, alınan birden fazla hatayı yakalamak mümkün.Bunun için “when” anahtar kelimesini kullanılır.

begin
……..
……….
………
exception
when exception1 then
———gerekli kodlar
——————–
when exception2 then
———gerekli kodlar
————–
when others then
————
.
.
end;

“exception1, exception2, …exceptionN” önceden tanımlı bir hata olabileceği gibi ,tanımsız olan herhangibir hata ya da kullanıcının tanımladıgı bir hata da olabilir.Önceden tanımlı hatalara örnek olarak

no_data_found
to_many_rows
zero_divide
…..
verilebilir.Bazı önceden tanımlı hatalar ve kodları aşağıda verilmiştir.


Exception Oracle Error SQLCODE Value
ACCESS_INTO_NULL ORA-06530 -6530
CASE_NOT_FOUND ORA-06592 -6592
COLLECTION_IS_NULL ORA-06531 -6531
CURSOR_ALREADY_OPEN ORA-06511 -6511
DUP_VAL_ON_INDEX ORA-00001 -1
INVALID_CURSOR ORA-01001 -1001
INVALID_NUMBER ORA-01722 -1722
LOGIN_DENIED ORA-01017 -1017
NO_DATA_FOUND ORA-01403 +100
NOT_LOGGED_ON ORA-01012 -1012
PROGRAM_ERROR ORA-06501 -6501
ROWTYPE_MISMATCH …………………….. ORA-06504 ……………………. -6504 …………………

Önceden tanımlı hata kodları ile tanımı olmayan diger hatalarda muhakkak bir hata kodu(ORA-xyzwt) bulunmaktadır.Belirli bir hatayı değilde alınan herhangibir ya da belirtilmeyen başka hataları yakalamak için “when” den sonra “others” kullanılır.

NOT : Oracle , hata oluştugu anda bu hataya ait hata kodunu “sqlcode” değişkenine, hata acıklamasını da “sqlerrm” değişkenine otomatik olarak atar.Bunlar gerekirse okunarak kullanılabilir.Kullanıcı tanımlı hatalar için de öncelikte hata değişkeni tanımı yapılmalıdır.Bunun herhangibir veri tipi tanımlamadan farkı yoktur.

declare
something_wrong exception;
declare
if(…) then
raise someting_wrong;
…………….
………
exception
when something_wrong then
–gerekli işlemler…
when others then
–gerekli işlemler….
end;

“exception” bloğuna düşen hatada bir takım işlemler yapılabileceği gibi bu PL/SQL kodunu çağıran yere de bir hata fırlatmak isteyebiliriz.(throw exception).Bunun içinde “raise _applicaion_error(errorID, errorDesc)” kullanılır.“errorID” ve “errorDesc” alanlarını kullanıcı belirler.”errorID” [-20000,-20999] arasında bir değer olmalıdır.”errorDesc” alanıda en fazla 2000 karakterlik “varchar2” veri tipinde açıklama yazılabilir.

Örneğin bir prosedürümüz olsun ve bu prosedür basitçe gönderilen parametrenin 1000’den büyük olup olmadıgını kontrol etsin.Büyük ise yukarı hata versin.

procedure prc_checkValue(p_vlaue number) is
begin
if(p_value > 1000) then
raise_application_error(-20010,’Value is too large);
end;

Bunu yapmanın bir başka yoluda bir hata tanımlayıp bu hatayı “raise etmek :

procedure prc_checkValue(p_vlaue number) is
too_large exception;
begin
if(p_value > 1000) then
raise too_large;
exception
when too_large then
raise_application_error(-20010,’Value is too large);
end;

28 Kasım 2008 Cuma

Pl/Sql

Dynamic SQL, runtime'de oluşturulan bir SQL'in çalıştırılmasıdır. Normalde programlarda veya PL/SQL bloklarında sorgu yazarken hard code olarak yazıp çalıştırılan SQL'ler static SQL'dir. Örneğin SQL*Plus üzerine yazdığımız bütün SQL'leri dynamic SQL ile çalıştırır. Dynamic SQL kavramı kullanım örneklerinden sonra daha anlaşılır olacaktır. • Dynamic SQL esnektir, kullanımı büyük esneklik sağlar, Ama Static SQL kullanmak çoğu zaman daha performanslı olacağı için static SQL ile yapılabilecek şeyleri static SQL ile yapmalı, dynamic SQL'i mecbur olduğunda kullanmalıdır. • Dynamic SQL'i ne zaman kullanırız? Run-time'da sorgularımızın inputlara gre veya başka şartlarda değişebileceği durumlarda veya DDL çalıştırmak için kullanırız. (Normalde PL/SQL bloğu içinde DDL çalıştırılamıyor) • Dynamic SQL, PL/SQL içinde iki şekilde kullanılabilir: Birincisi EXECUTE IMMEDIATE komutu ile, ikincisi ise DBMS_SQL paketi ile. Execute Immediate ile DML'leri, DDL'leri, PL/SQL bloklarını, Transaction Control komutlarını ve Session Control komutlarını kolaylıkla çalıştırabilirsiniz. Bu komut, sorgunun dinamik olarak runtime'da parse edilip çalıştırılmasını sağlar. DBMS_SQL paketi ise, biraz daha gelişmiş özellikleri barındırır. Daha çok özel amaçlarla kullanılır. Örneğin, sorgudan dönen kolon isimleri veya kolon sayısı gibi bir bilgi lazım olunca DBMS_SQL paketi kullanılabilir. Fakat daha fazla özellik barındırmayısla birlikte, kullanımı biraz daha zordur ve biraz daha yavaş çalışır. DBMS_SQL paketinin kullanımı ile ilgili ayrıntılı bilgiyi referanslarda da bulabilirsiniz. Her iki kullanım örneklerini de sunumda bulabilirsiniz. • Native Dynamic SQL(EXEC. IMMED.)'in avantajları: 1- Kullanımı kolaydır.2- Daha hızlı çalışır.3- Kullanıcı tanımlı tipleri destekler.4- Dönen kayıtları RECORD'lar içine atabilir. • DBMS_SQL paketinin avantajları: 1- Input ve output sayısı bilinmediğinde de kullanılabilir.2- Select'ten dönecek kolon sayısı veya isimleri belli olmadığında da çalıştırılabilir.3- 32KB'dan daha uzun sorguları da çalıştırabilir.4- Tekrar kullanılabilirliği sağlar. • Amacımız genellikle performans ve kolaylık avantajını yaklamak olduğu için, yapabildiğimiz herşeyi EXEC. IMMED. ile yapmamız daa mantıklı. Ama DBMS_SQL paketine gerçekten ihtiyacımız olan durumlr da oluyor, bu yüzden bu paketi ve yetkinliklerini bilmemiz de önemli.