PL / SQL - Hızlı Kılavuz
PL / SQL programlama dili, 1980'lerin sonunda, SQL ve Oracle ilişkisel veritabanı için prosedürel uzantı dili olarak Oracle Corporation tarafından geliştirilmiştir. Aşağıda PL / SQL hakkında bazı önemli gerçekler yer almaktadır -
PL / SQL tamamen taşınabilir, yüksek performanslı bir işlem işleme dilidir.
PL / SQL, yerleşik, yorumlanmış ve işletim sisteminden bağımsız bir programlama ortamı sağlar.
PL / SQL ayrıca doğrudan komut satırından da çağrılabilir SQL*Plus interface.
Harici programlama dili aramalarından veri tabanına doğrudan arama da yapılabilir.
PL / SQL'in genel sözdizimi ADA ve Pascal programlama diline dayanmaktadır.
Oracle dışında PL / SQL, TimesTen in-memory database ve IBM DB2.
PL / SQL'in Özellikleri
PL / SQL aşağıdaki özelliklere sahiptir -
- PL / SQL, SQL ile sıkı bir şekilde entegre edilmiştir.
- Kapsamlı hata kontrolü sunar.
- Çok sayıda veri türü sunar.
- Çeşitli programlama yapıları sunar.
- Fonksiyonlar ve prosedürler aracılığıyla yapısal programlamayı destekler.
- Nesne yönelimli programlamayı destekler.
- Web uygulamalarının ve sunucu sayfalarının geliştirilmesini destekler.
PL / SQL'in Avantajları
PL / SQL aşağıdaki avantajlara sahiptir -
SQL, standart veritabanı dilidir ve PL / SQL, SQL ile güçlü bir şekilde entegre edilmiştir. PL / SQL hem statik hem de dinamik SQL'i destekler. Statik SQL, PL / SQL bloğundan DML işlemlerini ve işlem kontrolünü destekler. Dinamik SQL'de SQL, DDL ifadelerinin PL / SQL bloklarına gömülmesine izin verir.
PL / SQL, bir defada veritabanına tüm bir ifade bloğunun gönderilmesine izin verir. Bu, ağ trafiğini azaltır ve uygulamalar için yüksek performans sağlar.
PL / SQL, bir veritabanındaki verileri sorgulayabildiği, dönüştürebildiği ve güncelleyebildiği için programcılara yüksek verimlilik sağlar.
PL / SQL, istisna işleme, kapsülleme, veri gizleme ve nesne yönelimli veri türleri gibi güçlü özelliklerle tasarım ve hata ayıklamada zaman kazandırır.
PL / SQL ile yazılmış uygulamalar tamamen taşınabilirdir.
PL / SQL, yüksek güvenlik seviyesi sağlar.
PL / SQL, önceden tanımlanmış SQL paketlerine erişim sağlar.
PL / SQL, Nesne Tabanlı Programlama için destek sağlar.
PL / SQL, Web Uygulamaları ve Sunucu Sayfaları geliştirmek için destek sağlar.
Bu bölümde, PL / SQL Ortam Kurulumunu tartışacağız. PL / SQL, bağımsız bir programlama dili değildir; Oracle programlama ortamında bulunan bir araçtır.SQL* Pluskomut isteminde SQL ve PL / SQL deyimlerini yazmanıza izin veren etkileşimli bir araçtır. Bu komutlar daha sonra işlenmek üzere veritabanına gönderilir. Ekstreler işlendikten sonra sonuçlar geri gönderilir ve ekranda görüntülenir.
PL / SQL programlarını çalıştırmak için, makinenizde Oracle RDBMS Sunucusunun kurulu olması gerekir. Bu, SQL komutlarının yürütülmesini sağlayacaktır. Oracle RDBMS'nin en yeni sürümü 11g'dir. Oracle 11g'nin deneme sürümünü aşağıdaki bağlantıdan indirebilirsiniz -
Oracle 11g Express Edition'ı indirin
İşletim sisteminize göre kurulumun 32 bit veya 64 bit sürümünü indirmeniz gerekecektir. Genellikle iki dosya vardır. 64 bit sürümünü indirdik. Linux veya Solaris olması farketmeksizin işletim sisteminizde de benzer adımlar kullanacaksınız.
win64_11gR2_database_1of2.zip
win64_11gR2_database_2of2.zip
Yukarıdaki iki dosyayı indirdikten sonra, bunları tek bir dizinde açmanız gerekecek database ve bunun altında aşağıdaki alt dizinleri bulacaksınız -
Aşama 1
Şimdi kurulum dosyasını kullanarak Oracle Database Installer'ı başlatalım. İlk ekran aşağıdadır. E-posta kimliğinizi sağlayabilir ve aşağıdaki ekran görüntüsünde gösterildiği gibi onay kutusunu işaretleyebilirsiniz. TıklaNext buton.
Adım 2
Aşağıdaki ekrana yönlendirileceksiniz; onay kutusunun işaretini kaldırın veContinue Devam etmek için düğmesine basın.
Aşama 3
Sadece ilk seçeneği seçin Create and Configure Database radyo düğmesini kullanarak ve Next Devam etmek için düğmesine basın.
4. adım
Oracle'ı temel öğrenme amacı için kurduğunuzu ve onu PC'nize veya Dizüstü bilgisayarınıza kurduğunuzu varsayıyoruz. Bu nedenle,Desktop Class seçeneğini tıklayın ve Next Devam etmek için düğmesine basın.
Adım 5
Oracle Sunucusunu kuracağınız bir konum sağlayın. Sadece değiştirinOracle Baseve diğer yerler otomatik olarak ayarlanacaktır. Ayrıca bir parola da girmeniz gerekecektir; bu sistem DBA'sı tarafından kullanılacaktır. Gerekli bilgileri sağladıktan sonra,Next Devam etmek için düğmesine basın.
6. Adım
Tekrar tıklayın Next Devam etmek için düğmesine basın.
7. Adım
Tıkla Finishdevam etmek için düğme; bu gerçek sunucu kurulumunu başlatacaktır.
8. Adım
Oracle gerekli konfigürasyonu gerçekleştirmeye başlayana kadar bu birkaç dakika sürecektir.
9. Adım
Oracle kurulumu burada gerekli konfigürasyon dosyalarını kopyalayacaktır. Bu biraz zaman almalı -
10. adım
Veritabanı dosyaları kopyalandıktan sonra aşağıdaki diyalog kutusuna sahip olacaksınız. Sadece tıklayınOK düğmesine basın ve çıkın.
11. adım
Kurulumun ardından aşağıdaki son pencereye sahip olacaksınız.
Son adım
Şimdi kurulumunuzu doğrulama zamanı. Komut isteminde, Windows kullanıyorsanız aşağıdaki komutu kullanın -
sqlplus "/ as sysdba"
PL / SQL komutlarınızı ve komut dosyalarınızı yazacağınız SQL komut istemine sahip olmalısınız -
Metin düzeltici
Büyük programları komut isteminden çalıştırmak, yanlışlıkla işin bir kısmını kaybetmenize neden olabilir. Her zaman komut dosyalarını kullanmanız önerilir. Komut dosyalarını kullanmak için -
Kodunuzu bir metin düzenleyicisine yazın, örneğin Notepad, Notepad+, veya EditPlus, vb.
Dosyayı şu şekilde kaydedin: .sql ev dizinindeki uzantı.
Başlat SQL*Plus command prompt PL / SQL dosyanızı oluşturduğunuz dizinden.
Tür @file_name Programınızı çalıştırmak için SQL * Plus komut isteminde.
PL / SQL komut dosyalarını yürütmek için bir dosya kullanmıyorsanız, PL / SQL kodunuzu kopyalayın ve SQL komut istemini görüntüleyen siyah pencereye sağ tıklayın; kullanpastekodun tamamını komut istemine yapıştırma seçeneği. Son olarak, sadeceEnter Zaten çalıştırılmadıysa kodu yürütmek için.
Bu bölümde, PL / SQL'in Temel Sözdizimini tartışacağız. block-structureddil; bu, PL / SQL programlarının bölündüğü ve mantıksal kod bloklarına yazıldığı anlamına gelir. Her blok üç alt bölümden oluşur -
S.No | Bölümler ve Açıklama |
---|---|
1 | Declarations Bu bölüm anahtar kelime ile başlar DECLARE. İsteğe bağlı bir bölümdür ve programda kullanılacak tüm değişkenleri, imleçleri, alt programları ve diğer öğeleri tanımlar. |
2 | Executable Commands Bu bölüm anahtar kelimeler arasına alınır BEGIN ve ENDve zorunlu bir bölümdür. Programın çalıştırılabilir PL / SQL ifadelerinden oluşur. En az bir çalıştırılabilir kod satırına sahip olmalıdır, bu sadece birNULL command hiçbir şeyin yürütülmemesi gerektiğini belirtmek için. |
3 | Exception Handling Bu bölüm anahtar kelime ile başlar EXCEPTION. Bu isteğe bağlı bölüm şunları içerir:exception(s) programdaki hataları işleyen. |
Her PL / SQL ifadesi bir noktalı virgül (;) ile biter. PL / SQL blokları, diğer PL / SQL bloklarının içine yerleştirilebilir.BEGIN ve END. Aşağıda bir PL / SQL bloğunun temel yapısı verilmiştir -
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling>
END;
'Merhaba Dünya' Örneği
DECLARE
message varchar2(20):= 'Hello, World!';
BEGIN
dbms_output.put_line(message);
END;
/
end;çizgi PL / SQL bloğunun sonunu gösterir. Kodu SQL komut satırından çalıştırmak için, kodun son satırından sonraki ilk boş satırın başına / yazmanız gerekebilir. Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Hello World
PL/SQL procedure successfully completed.
PL / SQL Tanımlayıcıları
PL / SQL tanımlayıcıları sabitler, değişkenler, istisnalar, prosedürler, imleçler ve ayrılmış kelimelerdir. Tanımlayıcılar, isteğe bağlı olarak daha fazla harf, sayı, dolar işareti, alt çizgi ve sayı işaretinin izlediği bir harften oluşur ve 30 karakteri geçmemelidir.
Varsayılan olarak, identifiers are not case-sensitive. Böylece kullanabilirsininteger veya INTEGERsayısal bir değeri temsil etmek için. Ayrılmış bir anahtar kelimeyi tanımlayıcı olarak kullanamazsınız.
PL / SQL Sınırlayıcıları
Sınırlayıcı, özel anlamı olan bir semboldür. PL / SQL'deki sınırlayıcıların listesi aşağıdadır -
Sınırlayıcı | Açıklama |
---|---|
+, -, *, / | Toplama, çıkarma / olumsuzlama, çarpma, bölme |
% | Öznitelik göstergesi |
' | Karakter dizisi sınırlayıcı |
. | Bileşen seçici |
(,) | İfade veya liste sınırlayıcı |
: | Ana bilgisayar değişken göstergesi |
, | Öğe ayırıcı |
" | Alıntılanmış tanımlayıcı sınırlayıcı |
= | İlişkisel operatör |
@ | Uzaktan erişim göstergesi |
; | İfade sonlandırıcı |
:= | Atama operatörü |
=> | İlişkilendirme operatörü |
|| | Birleştirme operatörü |
** | Üs alma operatörü |
<<, >> | Etiket sınırlayıcı (başlangıç ve bitiş) |
/*, */ | Çok satırlı yorum sınırlayıcı (başlangıç ve bitiş) |
-- | Tek satırlık yorum göstergesi |
.. | Menzil operatörü |
<, >, <=, >= | İlişkisel operatörler |
<>, '=, ~=, ^= | NOT EQUAL'in farklı sürümleri |
PL / SQL Yorumları
Program yorumları, yazdığınız PL / SQL koduna dahil edilebilen ve herkesin kaynak kodunu okumasına yardımcı olan açıklayıcı ifadelerdir. Tüm programlama dilleri bazı tür yorumlara izin verir.
PL / SQL, tek satırlı ve çok satırlı açıklamaları destekler. Herhangi bir yorumun içinde bulunan tüm karakterler PL / SQL derleyicisi tarafından göz ardı edilir. PL / SQL tek satırlı açıklamalar, sınırlayıcı - (çift tire) ile başlar ve çok satırlı açıklamalar / * ve * / ile çevrelenir.
DECLARE
-- variable declaration
message varchar2(20):= 'Hello, World!';
BEGIN
/*
* PL/SQL executable statement(s)
*/
dbms_output.put_line(message);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Hello World
PL/SQL procedure successfully completed.
PL / SQL Program Birimleri
Bir PL / SQL birimi aşağıdakilerden herhangi biridir -
- PL / SQL bloğu
- Function
- Package
- Paket gövdesi
- Procedure
- Trigger
- Type
- Tip gövde
Bu birimlerin her biri sonraki bölümlerde tartışılacaktır.
Bu bölümde, PL / SQL'deki Veri Türlerini tartışacağız. PL / SQL değişkenleri, sabitleri ve parametreleri, bir depolama biçimini, kısıtlamaları ve geçerli bir değer aralığını belirten geçerli bir veri türüne sahip olmalıdır. OdaklanacağızSCALAR ve LOBbu bölümdeki veri türleri. Diğer iki veri türü diğer bölümlerde ele alınacaktır.
S.No | Kategori tanımı |
---|---|
1 | Scalar Dahili bileşen içermeyen tek değerler, örneğin NUMBER, DATE, veya BOOLEAN. |
2 | Large Object (LOB) Metin, grafik görüntüler, video klipler ve ses dalga biçimleri gibi diğer veri öğelerinden ayrı olarak depolanan büyük nesnelere işaret eder. |
3 | Composite Tek tek erişilebilen dahili bileşenlere sahip veri öğeleri. Örneğin koleksiyonlar ve kayıtlar. |
4 | Reference Diğer veri öğelerine işaretçiler. |
PL / SQL Skaler Veri Tipleri ve Alt Tipleri
PL / SQL Skaler Veri Türleri ve Alt Türleri aşağıdaki kategoriler altında gelir -
S.No | Tarih Tipi ve Açıklama |
---|---|
1 | Numeric Aritmetik işlemlerin gerçekleştirildiği sayısal değerler. |
2 | Character Tek karakterleri veya karakter dizilerini temsil eden alfanümerik değerler. |
3 | Boolean Mantıksal işlemlerin gerçekleştirildiği mantıksal değerler. |
4 | Datetime Tarihler ve saatler. |
PL / SQL, veri türlerinin alt türlerini sağlar. Örneğin, NUMBER veri türünün INTEGER adında bir alt türü vardır. PL / SQL kodunu Java programı gibi başka bir programa yerleştirirken veri türlerini diğer programlardaki veri türleriyle uyumlu hale getirmek için PL / SQL programınızdaki alt türleri kullanabilirsiniz.
PL / SQL Sayısal Veri Türleri ve Alt Türleri
Aşağıdaki tablo PL / SQL önceden tanımlanmış sayısal veri türlerini ve alt türlerini listeler -
S.No | Veri Türü ve Açıklaması |
---|---|
1 | PLS_INTEGER -2.147.483.648 ile 2.147.483.647 aralığında imzalı tam sayı, 32 bit olarak temsil edilir |
2 | BINARY_INTEGER -2.147.483.648 ile 2.147.483.647 aralığında imzalı tam sayı, 32 bit olarak temsil edilir |
3 | BINARY_FLOAT Tek duyarlıklı IEEE 754 biçimli kayan noktalı sayı |
4 | BINARY_DOUBLE Çift hassasiyetli IEEE 754 biçimli kayan noktalı sayı |
5 | NUMBER(prec, scale) Mutlak değeri 1E-130 ila 1.0E126 aralığında (ancak dahil değil) olan sabit nokta veya kayan noktalı sayı. Bir NUMBER değişkeni 0'ı da temsil edebilir |
6 | DEC(prec, scale) Maksimum 38 ondalık basamak hassasiyetine sahip ANSI'ye özgü sabit nokta türü |
7 | DECIMAL(prec, scale) Maksimum 38 ondalık basamak hassasiyetiyle IBM'e özgü sabit nokta türü |
8 | NUMERIC(pre, secale) Maksimum 38 ondalık basamak hassasiyetli kayan tip |
9 | DOUBLE PRECISION Maksimum 126 ikili basamak hassasiyetine sahip ANSI'ye özgü kayan nokta türü (yaklaşık 38 ondalık basamak) |
10 | FLOAT Maksimum 126 ikili basamak (yaklaşık 38 ondalık basamak) hassasiyete sahip ANSI ve IBM'e özgü kayan nokta türü |
11 | INT Maksimum 38 ondalık basamak hassasiyetine sahip ANSI'ye özgü tamsayı türü |
12 | INTEGER Maksimum 38 ondalık basamak hassasiyetiyle ANSI ve IBM'e özgü tamsayı türü |
13 | SMALLINT Maksimum 38 ondalık basamak hassasiyetiyle ANSI ve IBM'e özgü tamsayı türü |
14 | REAL Maksimum 63 ikili basamak hassasiyetine sahip kayan nokta tipi (yaklaşık 18 ondalık basamak) |
Aşağıda geçerli bir beyan yer almaktadır -
DECLARE
num1 INTEGER;
num2 REAL;
num3 DOUBLE PRECISION;
BEGIN
null;
END;
/
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
PL/SQL procedure successfully completed
PL / SQL Karakter Veri Tipleri ve Alt Tipleri
Aşağıda, PL / SQL önceden tanımlanmış karakter veri türleri ve bunların alt türlerinin ayrıntıları verilmiştir -
S.No | Veri Türü ve Açıklaması |
---|---|
1 | CHAR Maksimum 32.767 bayt boyutunda sabit uzunlukta karakter dizesi |
2 | VARCHAR2 Maksimum 32.767 bayt boyutunda değişken uzunlukta karakter dizesi |
3 | RAW PL / SQL tarafından yorumlanmayan maksimum 32.767 bayt boyutuna sahip değişken uzunluklu ikili veya bayt dizesi |
4 | NCHAR Maksimum 32.767 bayt boyutunda sabit uzunlukta ulusal karakter dizesi |
5 | NVARCHAR2 Maksimum 32.767 bayt boyutunda değişken uzunluklu ulusal karakter dizesi |
6 | LONG Maksimum 32.760 bayt boyutunda değişken uzunlukta karakter dizesi |
7 | LONG RAW PL / SQL tarafından yorumlanmayan, maksimum 32.760 bayt boyutunda değişken uzunluklu ikili veya bayt dizesi |
8 | ROWID Fiziksel satır tanımlayıcı, sıradan bir tablodaki bir satırın adresi |
9 | UROWID Evrensel satır tanımlayıcı (fiziksel, mantıksal veya yabancı satır tanımlayıcı) |
PL / SQL Boolean Veri Türleri
BOOLEANveri türü, mantıksal işlemlerde kullanılan mantıksal değerleri depolar. Mantıksal değerler Boolean değerleridirTRUE ve FALSE ve değer NULL.
Ancak, SQL'in BOOLEAN'a eşdeğer bir veri türü yoktur. Bu nedenle, Boole değerleri - içinde kullanılamaz
- SQL ifadeleri
- Yerleşik SQL işlevleri (örneğin TO_CHAR)
- SQL ifadelerinden çağrılan PL / SQL işlevleri
PL / SQL Tarih ve Aralık Türleri
DATEveri türü, gece yarısından itibaren saniye cinsinden günün saatini içeren sabit uzunluklu veri zamanlarını depolamak için kullanılır. Geçerli tarihler MÖ 1 Ocak 4712 ile MS 31 Aralık 9999 arasındadır.
Varsayılan tarih biçimi, Oracle başlatma parametresi NLS_DATE_FORMAT tarafından belirlenir. Örneğin, varsayılan ayın günü için iki basamaklı bir sayı, ay adının bir kısaltması ve yılın son iki basamağını içeren "GG-MON-YY" olabilir. Örneğin, 01-OCT-12.
Her DATE, yüzyılı, yılı, ayı, günü, saati, dakikayı ve saniyeyi içerir. Aşağıdaki tablo, her alan için geçerli değerleri göstermektedir -
Alan adı | Geçerli Tarih ve Saat Değerleri | Geçerli Aralık Değerleri |
---|---|---|
YIL | -4712 ila 9999 (0 yılı hariç) | Sıfır olmayan herhangi bir tam sayı |
AY | 01 - 12 | 0 ila 11 |
GÜN | 01 ila 31 (yerel ayardaki takvim kurallarına göre AY ve YIL değerleriyle sınırlıdır) | Sıfır olmayan herhangi bir tam sayı |
SAAT | 00-23 | 0-23 |
DAKİKA | 00 - 59 | 0 - 59 |
İKİNCİ | 00 - 59,9 (n), burada 9 (n), zaman kesirli saniyelerin hassasiyetidir | 0 - 59,9 (n), burada 9 (n), aralıklı kesirli saniye hassasiyetidir |
TIMEZONE_HOUR | -12 ila 14 (aralık, gün ışığından yararlanma saati değişikliklerini barındırır) | Uygulanamaz |
TIMEZONE_MINUTE | 00 - 59 | Uygulanamaz |
TIMEZONE_REGION | Dinamik performans görünümünde bulundu V $ TIMEZONE_NAMES | Uygulanamaz |
TIMEZONE_ABBR | Dinamik performans görünümünde bulundu V $ TIMEZONE_NAMES | Uygulanamaz |
PL / SQL Büyük Nesne (LOB) Veri Türleri
Büyük Nesne (LOB) veri türleri, metin, grafik görüntüler, video klipler ve ses dalga biçimleri gibi büyük veri öğelerini ifade eder. LOB veri türleri, bu verilere verimli, rastgele ve parçalı erişim sağlar. Önceden tanımlanmış PL / SQL LOB veri türleri aşağıdadır -
Veri tipi | Açıklama | Boyut |
---|---|---|
BFILE | Veritabanı dışındaki işletim sistemi dosyalarında büyük ikili nesneleri depolamak için kullanılır. | Sisteme bağlıdır. 4 gigabaytı (GB) aşamaz. |
BLOB | Veritabanında büyük ikili nesneleri depolamak için kullanılır. | 8-128 terabayt (TB) |
CLOB | Veritabanında büyük karakter verisi bloklarını depolamak için kullanılır. | 8-128 TB |
NCLOB | Veritabanında büyük NCHAR verisi bloklarını depolamak için kullanılır. | 8-128 TB |
PL / SQL Kullanıcı Tanımlı Alt Tipler
Alt tür, temel türü olarak adlandırılan başka bir veri türünün alt kümesidir. Bir alt tür, temel türüyle aynı geçerli işlemlere sahiptir, ancak yalnızca geçerli değerlerinin bir alt kümesine sahiptir.
PL / SQL, paketteki birkaç alt türü önceden tanımlar STANDARD. Örneğin, PL / SQL alt türleri önceden tanımlarCHARACTER ve INTEGER aşağıdaki gibi -
SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0);
Kendi alt türlerinizi tanımlayabilir ve kullanabilirsiniz. Aşağıdaki program, kullanıcı tanımlı bir alt tipin tanımlanmasını ve kullanılmasını göstermektedir -
DECLARE
SUBTYPE name IS char(20);
SUBTYPE message IS varchar2(100);
salutation name;
greetings message;
BEGIN
salutation := 'Reader ';
greetings := 'Welcome to the World of PL/SQL';
dbms_output.put_line('Hello ' || salutation || greetings);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Hello Reader Welcome to the World of PL/SQL
PL/SQL procedure successfully completed.
PL / SQL'de NULL'lar
PL / SQL NULL değerleri, missing veya unknown datave bir tamsayı, karakter veya başka herhangi bir belirli veri türü değildir. Bunu not etNULL boş bir veri dizesi veya boş karakter değeri ile aynı değildir '\0'. Bir boş atanabilir ancak kendisi dahil hiçbir şeyle eşitlenemez.
Bu bölümde, Pl / SQL'deki Değişkenleri tartışacağız. Değişken, programlarımızın değiştirebileceği bir depolama alanına verilen addan başka bir şey değildir. PL / SQL'deki her değişkenin, değişkenin belleğinin boyutunu ve düzenini belirleyen belirli bir veri türü vardır; bu bellekte saklanabilen değerler aralığı ve değişkene uygulanabilecek işlemler kümesi.
Bir PL / SQL değişkeninin adı, isteğe bağlı olarak daha fazla harf, sayı, dolar işareti, alt çizgi ve sayı işaretinin izlediği bir harften oluşur ve 30 karakteri geçmemelidir. Varsayılan olarak, değişken adları büyük / küçük harfe duyarlı değildir. Ayrılmış bir PL / SQL anahtar sözcüğünü değişken adı olarak kullanamazsınız.
PL / SQL programlama dili, sonraki bölümlerde ele alacağımız tarih ve saat veri türleri, kayıtlar, koleksiyonlar vb. Gibi çeşitli değişken türlerini tanımlamaya izin verir. Bu bölüm için sadece temel değişken türlerini inceleyelim.
PL / SQL'de Değişken Beyanı
PL / SQL değişkenleri, bildirim bölümünde veya bir pakette global bir değişken olarak bildirilmelidir. Bir değişken bildirdiğinizde, PL / SQL değişkenin değeri için bellek ayırır ve saklama konumu değişken adıyla tanımlanır.
Bir değişkeni bildirmek için sözdizimi -
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]
Nerede, değişken_adı PL / SQL geçerli bir tanımlayıcı olan, veri türü geçerli bir PL / SQL veri türü ya da biz zaten son bölümde ele olduğunuz kullanıcı tanımlı veri türü olmalıdır. Tanımları ile birlikte bazı geçerli değişken bildirimleri aşağıda gösterilmiştir -
sales number(10, 2);
pi CONSTANT double precision := 3.1415;
name varchar2(25);
address varchar2(100);
Veri türü ile bir boyut, ölçek veya hassasiyet sınırı sağladığınızda, buna constrained declaration. Kısıtlanmış bildirimler, kısıtlanmamış bildirimlere göre daha az bellek gerektirir. Örneğin -
sales number(10, 2);
name varchar2(25);
address varchar2(100);
PL / SQL'de Değişkenleri Başlatma
Bir değişkeni tanımladığınızda, PL / SQL ona varsayılan bir NULL değeri atar. NULL değerinden farklı bir değere sahip bir değişkeni başlatmak istiyorsanız, bunu bildirim sırasında aşağıdakilerden birini kullanarak yapabilirsiniz -
DEFAULT anahtar kelime
assignment Şebeke
Örneğin -
counter binary_integer := 0;
greetings varchar2(20) DEFAULT 'Have a Good Day';
Bir değişkenin bir NULL değer kullanarak NOT NULLkısıtlama. NOT NULL kısıtlamasını kullanırsanız, bu değişken için açıkça bir başlangıç değeri atamanız gerekir.
Değişkenleri doğru şekilde başlatmak iyi bir programlama uygulamasıdır, aksi takdirde programlar bazen beklenmedik sonuçlar üretebilir. Çeşitli değişken türlerini kullanan aşağıdaki örneği deneyin -
DECLARE
a integer := 10;
b integer := 20;
c integer;
f real;
BEGIN
c := a + b;
dbms_output.put_line('Value of c: ' || c);
f := 70.0/3.0;
dbms_output.put_line('Value of f: ' || f);
END;
/
Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -
Value of c: 30
Value of f: 23.333333333333333333
PL/SQL procedure successfully completed.
PL / SQL'de Değişken Kapsam
PL / SQL blokların yuvalanmasına izin verir, yani her program bloğu başka bir iç blok içerebilir. Bir değişken bir iç blokta bildirilirse, dış blok için erişilebilir değildir. Bununla birlikte, bir değişken bildirilmişse ve bir dış blok için erişilebilirse, aynı zamanda tüm iç içe geçmiş iç bloklar için erişilebilir. İki tür değişken kapsam vardır -
Local variables - Bir iç blokta bildirilen ve dış bloklara erişilemeyen değişkenler.
Global variables - En dıştaki blokta veya bir pakette bildirilen değişkenler.
Aşağıdaki örnek, Local ve Global basit haliyle değişkenler -
DECLARE
-- Global variables
num1 number := 95;
num2 number := 85;
BEGIN
dbms_output.put_line('Outer Variable num1: ' || num1);
dbms_output.put_line('Outer Variable num2: ' || num2);
DECLARE
-- Local variables
num1 number := 195;
num2 number := 185;
BEGIN
dbms_output.put_line('Inner Variable num1: ' || num1);
dbms_output.put_line('Inner Variable num2: ' || num2);
END;
END;
/
Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -
Outer Variable num1: 95
Outer Variable num2: 85
Inner Variable num1: 195
Inner Variable num2: 185
PL/SQL procedure successfully completed.
PL / SQL Değişkenlerine SQL Sorgu Sonuçlarını Atama
Kullanabilirsiniz SELECT INTOPL / SQL değişkenlerine değer atamak için SQL ifadesi. İçindeki her öğe içinSELECT list, içinde karşılık gelen, türle uyumlu bir değişken olmalıdır. INTO list. Aşağıdaki örnek kavramı göstermektedir. MÜŞTERİLER adlı bir tablo oluşturalım -
(For SQL statements, please refer to the SQL tutorial)
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
Table Created
Şimdi tabloya bazı değerler ekleyelim -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
Aşağıdaki program, yukarıdaki tablodaki değerleri PL / SQL değişkenlerine atar. SELECT INTO clause SQL -
DECLARE
c_id customers.id%type := 1;
c_name customers.name%type;
c_addr customers.address%type;
c_sal customers.salary%type;
BEGIN
SELECT name, address, salary INTO c_name, c_addr, c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line
('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal);
END;
/
Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -
Customer Ramesh from Ahmedabad earns 2000
PL/SQL procedure completed successfully
Bu bölümde tartışacağız constants ve literalsPL / SQL'de. Bir sabit, bir kez ilan edildiğinde programda değişmeyen bir değeri tutar. Sabit bir bildirim, adını, veri türünü ve değerini belirtir ve bunun için depolama alanı ayırır. Beyanname ayrıcaNOT NULL constraint.
Sabit Bildirmek
Kullanılarak bir sabit beyan edilir CONSTANTanahtar kelime. Bir başlangıç değeri gerektirir ve bu değerin değiştirilmesine izin vermez. Örneğin -
PI CONSTANT NUMBER := 3.141592654;
DECLARE
-- constant declaration
pi constant number := 3.141592654;
-- other declarations
radius number(5,2);
dia number(5,2);
circumference number(7, 2);
area number (10, 2);
BEGIN
-- processing
radius := 9.5;
dia := radius * 2;
circumference := 2.0 * pi * radius;
area := pi * radius * radius;
-- output
dbms_output.put_line('Radius: ' || radius);
dbms_output.put_line('Diameter: ' || dia);
dbms_output.put_line('Circumference: ' || circumference);
dbms_output.put_line('Area: ' || area);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Radius: 9.5
Diameter: 19
Circumference: 59.69
Area: 283.53
Pl/SQL procedure successfully completed.
PL / SQL Değişmezleri
Değişmez bilgi, bir tanımlayıcı tarafından temsil edilmeyen açık bir sayısal, karakter, dize veya Boole değeridir. Örneğin, TRUE, 786, NULL, 'tutorialspoint', Boolean, sayı veya dize türündeki sabit değerlerdir. PL / SQL, değişmez değerler büyük / küçük harfe duyarlıdır. PL / SQL şu tür değişmez değerleri destekler -
- Sayısal Değişmezler
- Karakter Değişmezleri
- Dize Değişmezleri
- BOOLEAN Literals
- Tarih ve Saat Sabit Değerleri
Aşağıdaki tablo, tüm bu değişmez değer kategorilerinden örnekler sağlar.
S.No | Değişmez Tip ve Örnek |
---|---|
1 | Numeric Literals 050 78-14 0 +32767 6.6667 0.0 -12.0 3.14159 +7800.00 6E5 1.0E-8 3.14159e0 -1E38 -9.5e-3 |
2 | Character Literals 'A' '%' '9' '' 'z' '(' |
3 | String Literals 'Selam Dünya!' 'Eğitim Noktası' '19-KASIM-12 ' |
4 | BOOLEAN Literals DOĞRU, YANLIŞ ve BOŞ. |
5 | Date and Time Literals TARİH '1978-12-25'; TIMESTAMP '2012-10-29 12:01:01'; |
Değişmez dize içine tek tırnak yerleştirmek için, aşağıdaki programda gösterildiği gibi yan yana iki tek tırnak işareti koyun -
DECLARE
message varchar2(30):= 'That''s tutorialspoint.com!';
BEGIN
dbms_output.put_line(message);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
That's tutorialspoint.com!
PL/SQL procedure successfully completed.
Bu bölümde, PL / SQL'deki operatörleri tartışacağız. Operatör, derleyiciye belirli matematiksel veya mantıksal işlemler yapmasını söyleyen bir semboldür. PL / SQL dili yerleşik operatörler açısından zengindir ve aşağıdaki operatör türlerini sağlar -
- Aritmetik operatörler
- İlişkisel operatörler
- Karşılaştırma operatörleri
- Mantıksal operatörler
- Dize operatörleri
Burada aritmetik, ilişkisel, karşılaştırma ve mantıksal operatörleri tek tek anlayacağız. String operatörleri daha sonraki bir bölümde tartışılacaktır -PL/SQL - Strings.
Aritmetik operatörler
Aşağıdaki tablo, PL / SQL tarafından desteklenen tüm aritmetik işleçleri göstermektedir. Farz edelimvariable A 10 tutar ve variable B 5 tutar, sonra -
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
+ | İki işlenen ekler | A + B 15 verecek |
- | İlk işlenenden ikinci işleneni çıkarır | A - B 5 verecek |
* | Her iki işleneni de çarpar | A * B 50 verecek |
/ | Payı, pay azaltıcıya böler | A / B 2 verecek |
** | Üs alma operatörü, bir işleneni diğerinin gücüne yükseltir | A ** B 100000 verecek |
İlişkisel Operatörler
İlişkisel operatörler iki ifadeyi veya değeri karşılaştırır ve bir Boole sonucu döndürür. Aşağıdaki tablo, PL / SQL tarafından desteklenen tüm ilişkisel operatörleri göstermektedir. Farz edelimvariable A 10 tutar ve variable B 20 tutar, sonra -
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
= | İki işlenenin değerlerinin eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A = B) doğru değil. |
! = <> ~ = |
İki işlenenin değerlerinin eşit olup olmadığını kontrol eder, değerler eşit değilse koşul doğru olur. | (A! = B) doğrudur. |
> | Soldaki işlenenin değerinin sağ işlenenin değerinden büyük olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A> B) doğru değil. |
< | Soldaki işlenenin değerinin sağ işlenenin değerinden küçük olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A <B) doğrudur. |
> = | Sol işlenenin değerinin sağ işlenenin değerinden büyük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A> = B) doğru değil. |
<= | Sol işlenenin değerinin sağ işlenenin değerinden küçük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A <= B) doğrudur |
Karşılaştırma Operatörleri
Karşılaştırma operatörleri, bir ifadeyi diğeriyle karşılaştırmak için kullanılır. Sonuç her zaman yaTRUE, FALSE veya NULL.
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
SEVMEK | LIKE operatörü bir karakter, dize veya CLOB değerini bir desenle karşılaştırır ve değer desenle eşleşirse TRUE, eşleşmiyorsa FALSE döndürür. | "Z% A_i" gibi "Zara Ali" bir Boole değeri döndürürken, "Z% A_i" gibi "Nuha Ali" bir Boolean false döndürür. |
ARASINDA | BETWEEN operatörü, bir değerin belirtilen aralıkta olup olmadığını test eder. x ARASI a VE b, x> = a ve x <= b anlamına gelir. | X = 10 ise, x 5 ile 20 arasında doğru, x 5 ile 10 arasında doğru, ancak 11 ile 20 arasındaki x yanlış döndürür. |
İÇİNDE | IN operatörü testleri üyeliği ayarlar. x IN (set), x'in herhangi bir set üyesine eşit olduğu anlamına gelir. | Eğer x = 'm' ise, x in ('a', 'b', 'c'), Boolean false döndürür, ancak x in ('m', 'n', 'o'), Boolean true döndürür. |
BOŞ | IS NULL operatörü, işlenen NULL ise DOĞRU, NULL değilse FALSE BOOLEAN değerini döndürür. NULL değerleri içeren karşılaştırmalar her zaman NULL verir. | X = 'm' ise, 'x null', Boolean false değerini döndürür. |
Mantıksal operatörler
Aşağıdaki tablo PL / SQL tarafından desteklenen Mantıksal operatörleri göstermektedir. Tüm bu operatörler Boole işlenenleri üzerinde çalışır ve Boolean sonuçları üretir. Farz edelimvariable A doğrudur ve variable B yanlış tutar, o zaman -
Örnekleri Göster
Şebeke | Açıklama | Örnekler |
---|---|---|
ve | Mantıksal AND işlecini çağırdı. Her iki işlenen de doğruysa koşul doğru olur. | (A ve B) yanlıştır. |
veya | Mantıksal OR Operatörü çağrıldı. İki işlenenden herhangi biri doğruysa, koşul doğru olur. | (A veya B) doğrudur. |
değil | Mantıksal NOT Operatörü olarak adlandırıldı. İşlenenin mantıksal durumunu tersine çevirmek için kullanılır. Bir koşul doğruysa, Mantıksal NOT operatörü onu yanlış yapar. | değil (A ve B) doğru değil. |
PL / SQL Operatör Önceliği
Operatör önceliği, bir ifadedeki terimlerin gruplandırılmasını belirler. Bu, bir ifadenin nasıl değerlendirileceğini etkiler. Bazı operatörler diğerlerinden daha yüksek önceliğe sahiptir; örneğin, çarpma operatörü toplama operatöründen daha yüksek önceliğe sahiptir.
Örneğin, x = 7 + 3 * 2; buraya,x atandı 13, 20 değil çünkü * operatörü + 'dan daha yüksek önceliğe sahiptir, bu nedenle önce ile çarpılır 3*2 ve sonra ekler 7.
Burada, en yüksek önceliğe sahip operatörler tablonun en üstünde, en düşük olanlar ise en altta görünür. Bir ifade içinde, daha yüksek öncelikli operatörler ilk olarak değerlendirilecektir.
Operatörlerin önceliği şu şekildedir: =, <,>, <=,> =, <>,! =, ~ =, ^ =, IS NULL, LIKE, BETWEEN, IN.
Örnekleri Göster
Şebeke | Operasyon |
---|---|
** | üs alma |
+, - | kimlik, olumsuzluk |
*, / | çarpma, bölme |
+, -, || | toplama, çıkarma, birleştirme |
karşılaştırma | |
DEĞİL | mantıksal olumsuzlama |
VE | bağlaç |
VEYA | dahil etme |
Bu bölümde, PL / SQL'deki koşulları tartışacağız. Karar verme yapıları, programcının, program tarafından değerlendirilecek veya test edilecek bir veya daha fazla koşulu, koşulun doğru olduğu belirlenirse yürütülecek bir ifade veya ifadeyle birlikte belirtmesini ve isteğe bağlı olarak, eğer durum yanlış olarak belirlenir.
Aşağıda, programlama dillerinin çoğunda bulunan tipik bir koşullu (yani karar verme) yapının genel biçimi verilmiştir -
PL / SQL programlama dili, aşağıdaki türden karar verme ifadeleri sağlar. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.
S.No | Açıklama ve Açıklama |
---|---|
1 | IF - THEN ifadesi IF statement bir koşulu, anahtar kelimelerle çevrili bir dizi ifadeyle ilişkilendirir THEN ve END IF. Koşul doğruysa, ifadeler yürütülür ve koşul yanlış veya NULL ise, IF ifadesi hiçbir şey yapmaz. |
2 | IF-THEN-ELSE ifadesi IF statement anahtar kelimeyi ekler ELSEardından alternatif bir ifade dizisi. Koşul yanlış veya NULL ise, yalnızca alternatif ifadeler dizisi yürütülür. İfade dizilerinden herhangi birinin yürütülmesini sağlar. |
3 | IF-THEN-ELSIF ifadesi Birkaç alternatif arasından seçim yapmanızı sağlar. |
4 | Durum bildirimi IF ifadesi gibi, CASE statement yürütülecek bir dizi deyim seçer. Bununla birlikte, diziyi seçmek için, CASE deyimi birden çok Boole ifadesi yerine bir seçici kullanır. Bir seçici, değeri birkaç alternatiften birini seçmek için kullanılan bir ifadedir. |
5 | CASE ifadesi arandı Aranan CASE ifadesi has no selectorve WHEN yan tümceleri Boolean değerleri veren arama koşullarını içerir. |
6 | yuvalanmış IF-THEN-ELSE Birini kullanabilirsin IF-THEN veya IF-THEN-ELSIF bir başkasının içinde ifade IF-THEN veya IF-THEN-ELSIF beyan (lar). |
Bu bölümde, PL / SQL'deki Döngüler tartışılacaktır. Bir kod bloğunu birkaç kez çalıştırmanız gereken bir durum olabilir. Genel olarak, ifadeler sıralı olarak yürütülür: Bir fonksiyondaki ilk ifade önce çalıştırılır, ardından ikincisi vb.
Programlama dilleri, daha karmaşık yürütme yollarına izin veren çeşitli kontrol yapıları sağlar.
Bir döngü deyimi, bir deyimi veya deyim grubunu birden çok kez yürütmemize olanak tanır ve aşağıdaki programlama dillerinin çoğunda bir döngü deyiminin genel biçimidir -
PL / SQL, döngü gereksinimlerini karşılamak için aşağıdaki döngü türlerini sağlar. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.
S.No | Döngü Tipi ve Açıklaması |
---|---|
1 | PL / SQL Temel DÖNGÜ Bu döngü yapısında, ifade dizisi LOOP ve END LOOP komutları arasına alınır. Her yinelemede, ifade dizisi yürütülür ve ardından döngünün en üstünde kontrol devam eder. |
2 | PL / SQL DÖNGÜSÜNDE Belirli bir koşul doğruyken bir ifadeyi veya ifade grubunu tekrarlar. Döngü gövdesini çalıştırmadan önce koşulu test eder. |
3 | DÖNGÜ İÇİN PL / SQL Bir dizi ifadeyi birden çok kez çalıştırın ve döngü değişkenini yöneten kodu kısaltın. |
4 | PL / SQL'de iç içe döngüler Başka bir temel döngü içinde, while veya for döngüsü içinde bir veya daha fazla döngü kullanabilirsiniz. |
Bir PL / SQL Döngüsünü Etiketleme
PL / SQL döngüleri etiketlenebilir. Etiket çift açılı parantez (<< ve >>) içine alınmalı ve LOOP ifadesinin başında görünmelidir. Etiket adı, DÖNGÜ ifadesinin sonunda da görünebilir. Döngüden çıkmak için EXIT deyimindeki etiketi kullanabilirsiniz.
Aşağıdaki program kavramı göstermektedir -
DECLARE
i number(1);
j number(1);
BEGIN
<< outer_loop >>
FOR i IN 1..3 LOOP
<< inner_loop >>
FOR j IN 1..3 LOOP
dbms_output.put_line('i is: '|| i || ' and j is: ' || j);
END loop inner_loop;
END loop outer_loop;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
i is: 1 and j is: 1
i is: 1 and j is: 2
i is: 1 and j is: 3
i is: 2 and j is: 1
i is: 2 and j is: 2
i is: 2 and j is: 3
i is: 3 and j is: 1
i is: 3 and j is: 2
i is: 3 and j is: 3
PL/SQL procedure successfully completed.
Döngü Kontrol İfadeleri
Döngü kontrol ifadeleri, yürütmeyi normal sırasından değiştirir. Yürütme bir kapsam bıraktığında, bu kapsamda oluşturulan tüm otomatik nesneler yok edilir.
PL / SQL aşağıdaki kontrol ifadelerini destekler. Etiketleme döngüleri, kontrolü bir döngü dışına çıkarmaya da yardımcı olur. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.
S.No | Kontrol İfadesi ve Açıklama |
---|---|
1 | EXIT ifadesi Exit ifadesi döngüyü tamamlar ve kontrol, END LOOP'tan hemen sonra ifadeye geçer. |
2 | CONTINUE ifadesi Döngünün vücudunun geri kalanını atlamasına ve yinelemeden önce durumunu hemen yeniden test etmesine neden olur. |
3 | GOTO beyanı Kontrolü etiketli ifadeye aktarır. Programınızda GOTO ifadesini kullanmanız tavsiye edilmese de. |
PL / SQL'deki dize, aslında isteğe bağlı bir boyut belirtimine sahip bir karakter dizisidir. Karakterler sayısal, harfler, boş, özel karakterler veya hepsinin bir kombinasyonu olabilir. PL / SQL üç tür dizi sunar -
Fixed-length strings- Bu tür dizelerde, programcılar dizeyi bildirirken uzunluğu belirtirler. Dize, belirtilen uzunlukta boşluklarla sağ dolgulu.
Variable-length strings - Bu tür dizelerde, dize için maksimum 32.767'ye kadar uzunluk belirtilir ve herhangi bir dolgu yapılmaz.
Character large objects (CLOBs) - Bunlar, 128 terabayta kadar olabilen değişken uzunluklu dizelerdir.
PL / SQL dizeleri, değişkenler veya değişmez değerler olabilir. Dize değişmezi, tırnak işaretleri içine alınır. Örneğin,
'This is a string literal.' Or 'hello world'
Bir dizgenin içine tek bir alıntı eklemek için, yan yana iki tek tırnak yazmanız gerekir. Örneğin,
'this isn''t what it looks like'
Dize Değişkenlerini Bildirme
Oracle veritabanı CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB ve NCLOB gibi çok sayıda dize veri türü sağlar. Veri türleri bir'N' vardır 'national character set' Unicode karakter verilerini depolayan veri türleri.
Değişken uzunluklu bir dize bildirmeniz gerekiyorsa, bu dizenin maksimum uzunluğunu sağlamalısınız. Örneğin, VARCHAR2 veri türü. Aşağıdaki örnek, bazı dize değişkenlerini bildirmeyi ve kullanmayı gösterir -
DECLARE
name varchar2(20);
company varchar2(30);
introduction clob;
choice char(1);
BEGIN
name := 'John Smith';
company := 'Infotech';
introduction := ' Hello! I''m John Smith from Infotech.';
choice := 'y';
IF choice = 'y' THEN
dbms_output.put_line(name);
dbms_output.put_line(company);
dbms_output.put_line(introduction);
END IF;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
John Smith
Infotech
Hello! I'm John Smith from Infotech.
PL/SQL procedure successfully completed
Sabit uzunlukta bir dize bildirmek için CHAR veri türünü kullanın. Burada sabit uzunluklu bir değişken için maksimum uzunluk belirtmeniz gerekmez. Uzunluk kısıtlamasını kaldırırsanız, Oracle Database otomatik olarak gerekli olan maksimum uzunluğu kullanır. Aşağıdaki iki beyan aynıdır -
red_flag CHAR(1) := 'Y';
red_flag CHAR := 'Y';
PL / SQL String İşlevleri ve Operatörleri
PL / SQL, bitiştirme operatörünü sunar (||)iki dizeyi birleştirmek için. Aşağıdaki tablo PL / SQL tarafından sağlanan dizi işlevlerini sağlar -
S.No | İşlev ve Amaç |
---|---|
1 | ASCII(x); X karakterinin ASCII değerini döndürür. |
2 | CHR(x); X ASCII değerine sahip karakteri verir. |
3 | CONCAT(x, y); X ve y dizelerini birleştirir ve eklenen dizeyi döndürür. |
4 | INITCAP(x); X'teki her kelimenin ilk harfini büyük harfe dönüştürür ve o dizeyi döndürür. |
5 | INSTR(x, find_string [, start] [, occurrence]); Şunu arar: find_string x'de ve oluştuğu konumu döndürür. |
6 | INSTRB(x); Başka bir dize içindeki bir dizenin konumunu döndürür, ancak değeri bayt cinsinden döndürür. |
7 | LENGTH(x); X'teki karakter sayısını döndürür. |
8 | LENGTHB(x); Tek baytlık karakter kümesi için bayt cinsinden bir karakter dizesinin uzunluğunu döndürür. |
9 | LOWER(x); X'teki harfleri küçük harfe dönüştürür ve bu dizeyi döndürür. |
10 | LPAD(x, width [, pad_string]) ; Pedler x dizenin toplam uzunluğunu genişlik karakterlerine getirmek için solda boşluk bırakarak. |
11 | LTRIM(x [, trim_string]); Solundan karakterleri kırpar x. |
12 | NANVL(x, value); X, NaN özel değeriyle (bir sayı değil) eşleşirse değeri döndürür, aksi takdirde x Iade edildi. |
13 | NLS_INITCAP(x); NLSSORT tarafından belirtildiği gibi farklı bir sıralama yöntemi kullanabilmesi dışında INITCAP işleviyle aynıdır. |
14 | NLS_LOWER(x) ; Same as the LOWER function except that it can use a different sort method as specified by NLSSORT. |
15 | NLS_UPPER(x); Same as the UPPER function except that it can use a different sort method as specified by NLSSORT. |
16 | NLSSORT(x); Changes the method of sorting the characters. Must be specified before any NLS function; otherwise, the default sort will be used. |
17 | NVL(x, value); Returns value if x is null; otherwise, x is returned. |
18 | NVL2(x, value1, value2); Returns value1 if x is not null; if x is null, value2 is returned. |
19 | REPLACE(x, search_string, replace_string); Searches x for search_string and replaces it with replace_string. |
20 | RPAD(x, width [, pad_string]); Pads x to the right. |
21 | RTRIM(x [, trim_string]); Trims x from the right. |
22 | SOUNDEX(x) ; Returns a string containing the phonetic representation of x. |
23 | SUBSTR(x, start [, length]); Returns a substring of x that begins at the position specified by start. An optional length for the substring may be supplied. |
24 | SUBSTRB(x); Same as SUBSTR except that the parameters are expressed in bytes instead of characters for the single-byte character systems. |
25 | TRIM([trim_char FROM) x); Trims characters from the left and right of x. |
26 | UPPER(x); Converts the letters in x to uppercase and returns that string. |
Şimdi kavramı anlamak için birkaç örnek üzerinde çalışalım -
örnek 1
DECLARE
greetings varchar2(11) := 'hello world';
BEGIN
dbms_output.put_line(UPPER(greetings));
dbms_output.put_line(LOWER(greetings));
dbms_output.put_line(INITCAP(greetings));
/* retrieve the first character in the string */
dbms_output.put_line ( SUBSTR (greetings, 1, 1));
/* retrieve the last character in the string */
dbms_output.put_line ( SUBSTR (greetings, -1, 1));
/* retrieve five characters,
starting from the seventh position. */
dbms_output.put_line ( SUBSTR (greetings, 7, 5));
/* retrieve the remainder of the string,
starting from the second position. */
dbms_output.put_line ( SUBSTR (greetings, 2));
/* find the location of the first "e" */
dbms_output.put_line ( INSTR (greetings, 'e'));
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
HELLO WORLD
hello world
Hello World
h
d
World
ello World
2
PL/SQL procedure successfully completed.
Örnek 2
DECLARE
greetings varchar2(30) := '......Hello World.....';
BEGIN
dbms_output.put_line(RTRIM(greetings,'.'));
dbms_output.put_line(LTRIM(greetings, '.'));
dbms_output.put_line(TRIM( '.' from greetings));
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
......Hello World
Hello World.....
Hello World
PL/SQL procedure successfully completed.
Bu bölümde, PL / SQL'deki dizileri tartışacağız. PL / SQL programlama dili,VARRAY, aynı türden öğelerin sabit boyutlu sıralı bir koleksiyonunu depolayabilir. Bir değişken, sıralı bir veri koleksiyonunu depolamak için kullanılır, ancak bir diziyi aynı türden değişkenlerin bir koleksiyonu olarak düşünmek genellikle daha iyidir.
Tüm değişkenler bitişik bellek konumlarından oluşur. En düşük adres ilk öğeye ve en yüksek adres son öğeye karşılık gelir.
Dizi, veri toplama türünün bir parçasıdır ve değişken boyutlu dizileri ifade eder. Diğer koleksiyon türlerini daha sonraki bir bölümde inceleyeceğiz'PL/SQL Collections'.
Her eleman bir varrayonunla ilişkili bir dizine sahiptir. Ayrıca dinamik olarak değiştirilebilen bir maksimum boyuta sahiptir.
Bir Varray Türü Oluşturma
Bir değişken türü oluşturulur. CREATE TYPEBeyan. Varray'de depolanan öğelerin maksimum boyutunu ve türünü belirtmelisiniz.
Şema düzeyinde bir VARRAY türü oluşturmak için temel sözdizimi şudur:
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
Nerede,
- varray_type_name geçerli bir öznitelik adıdır,
- n , varyraydaki eleman sayısıdır (maksimum),
- öğe_türü , dizinin öğelerinin veri türüdür.
Bir varyantın maksimum boyutu, ALTER TYPE Beyan.
Örneğin,
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10);
/
Type created.
Bir PL / SQL bloğu içinde bir VARRAY türü oluşturmak için temel sözdizimi şudur:
TYPE varray_type_name IS VARRAY(n) of <element_type>
Örneğin -
TYPE namearray IS VARRAY(5) OF VARCHAR2(10);
Type grades IS VARRAY(5) OF INTEGER;
Şimdi kavramı anlamak için birkaç örnek üzerinde çalışalım -
örnek 1
Aşağıdaki program, değişkenlerin kullanımını göstermektedir -
DECLARE
type namesarray IS VARRAY(5) OF VARCHAR2(10);
type grades IS VARRAY(5) OF INTEGER;
names namesarray;
marks grades;
total integer;
BEGIN
names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i in 1 .. total LOOP
dbms_output.put_line('Student: ' || names(i) || '
Marks: ' || marks(i));
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Total 5 Students
Student: Kavita Marks: 98
Student: Pritam Marks: 97
Student: Ayan Marks: 78
Student: Rishav Marks: 87
Student: Aziz Marks: 92
PL/SQL procedure successfully completed.
Please note -
Oracle ortamında, değişkenler için başlangıç dizini her zaman 1'dir.
Varray ile aynı ada sahip olan varray türünün yapıcı yöntemini kullanarak varray öğelerini başlatabilirsiniz.
Değişkenler tek boyutlu dizilerdir.
Bir değişken, bildirildiğinde otomatik olarak NULL olur ve öğelerine başvurulmadan önce ilklendirilmesi gerekir.
Örnek 2
Bir değişkenin öğeleri, herhangi bir veritabanı tablosunun% ROWTYPE'ı veya herhangi bir veritabanı tablosu alanının% TYPE'ı olabilir. Aşağıdaki örnek kavramı göstermektedir.
Veritabanımızda saklanan MÜŞTERİLER tablosunu şu şekilde kullanacağız:
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
Aşağıdaki örnek şunları kullanır: cursorayrı bir bölümde detaylı olarak çalışacağınız.
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
type c_list is varray (6) of customers.name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter + 1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter ||'):'||name_list(counter));
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
Bu bölümde, PL / SQL'deki Prosedürleri tartışacağız. Birsubprogrambelirli bir görevi yerine getiren bir program birimi / modülüdür. Bu alt programlar, daha büyük programlar oluşturmak için birleştirilir. Bu temelde 'Modüler tasarım' olarak adlandırılır. Bir alt program, başka bir alt program veya program tarafından çağrılabilir.calling program.
Bir alt program oluşturulabilir -
- Şema düzeyinde
- Bir paketin içinde
- Bir PL / SQL bloğunun içinde
Şema düzeyinde, alt program bir standalone subprogram. CREATE PROCEDURE veya CREATE FUNCTION ifadesiyle oluşturulur. Veritabanında saklanır ve DROP PROCEDURE veya DROP FUNCTION ifadesiyle silinebilir.
Bir paket içinde oluşturulan bir alt program bir packaged subprogram. Veritabanında saklanır ve yalnızca paket DROP PACKAGE ifadesiyle silindiğinde silinebilir. Bu bölümde paketleri tartışacağız'PL/SQL - Packages'.
PL / SQL alt programları, bir dizi parametre ile çağrılabilen PL / SQL blokları olarak adlandırılır. PL / SQL iki tür alt program sağlar -
Functions- Bu alt programlar tek bir değer döndürür; esas olarak bir değeri hesaplamak ve döndürmek için kullanılır.
Procedures- Bu alt programlar doğrudan bir değer döndürmez; çoğunlukla bir eylemi gerçekleştirmek için kullanılır.
Bu bölüm, bir ürünün önemli yönlerini kapsayacaktır. PL/SQL procedure. TartışacağızPL/SQL function sonraki bölümde.
PL / SQL Alt Programının Parçaları
Her PL / SQL alt programının bir adı vardır ve ayrıca bir parametre listesi de olabilir. Anonim PL / SQL blokları gibi, adlandırılmış bloklar da aşağıdaki üç parçaya sahip olacaktır -
S.No | Parçalar ve Açıklama |
---|---|
1 | Declarative Part İsteğe bağlı bir kısımdır. Bununla birlikte, bir alt programın bildirim bölümü DECLARE anahtar sözcüğüyle başlamaz. Türlerin, imleçlerin, sabitlerin, değişkenlerin, istisnaların ve iç içe geçmiş alt programların bildirimlerini içerir. Bu öğeler alt program için yereldir ve alt program yürütmeyi tamamladığında varolmaz. |
2 | Executable Part Bu zorunlu bir bölümdür ve belirlenen eylemi gerçekleştiren ifadeler içerir. |
3 | Exception-handling Bu yine isteğe bağlı bir bölümdür. Çalışma zamanı hatalarını işleyen kodu içerir. |
Prosedür Oluşturmak
İle bir prosedür oluşturulur. CREATE OR REPLACE PROCEDUREBeyan. CREATE OR REPLACE PROCEDURE deyiminin basitleştirilmiş sözdizimi aşağıdaki gibidir -
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
< procedure_body >
END procedure_name;
Nerede,
prosedür-adı , prosedürün adını belirtir.
[VEYA DEĞİŞTİR] seçeneği, mevcut bir prosedürün değiştirilmesine izin verir.
İsteğe bağlı parametre listesi, parametrelerin adını, modunu ve türlerini içerir. IN dışarıdan iletilecek değeri, OUT ise prosedür dışında bir değer döndürmek için kullanılacak parametreyi temsil eder.
yordam gövdesi çalıştırılabilir parçayı içerir.
Bağımsız bir prosedür oluşturmak için IS anahtar sözcüğü yerine AS anahtar sözcüğü kullanılır.
Misal
Aşağıdaki örnek, 'Merhaba Dünya!' Dizesini görüntüleyen basit bir prosedür oluşturur. çalıştırıldığında ekranda.
CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
dbms_output.put_line('Hello World!');
END;
/
Yukarıdaki kod SQL istemi kullanılarak yürütüldüğünde, aşağıdaki sonucu üretecektir -
Procedure created.
Bağımsız Bir Prosedürün Yürütülmesi
Bağımsız bir prosedür iki şekilde çağrılabilir -
Kullanmak EXECUTE anahtar kelime
Bir PL / SQL bloğundan prosedürün adını çağırma
Yukarıdaki prosedür adlandırıldı 'greetings' EXECUTE anahtar sözcüğüyle şu şekilde çağrılabilir:
EXECUTE greetings;
Yukarıdaki çağrı görüntülenecektir -
Hello World
PL/SQL procedure successfully completed.
Prosedür başka bir PL / SQL bloğundan da çağrılabilir -
BEGIN
greetings;
END;
/
Yukarıdaki çağrı görüntülenecektir -
Hello World
PL/SQL procedure successfully completed.
Bağımsız Bir Prosedürü Silme
Bağımsız bir prosedür, DROP PROCEDUREBeyan. Bir prosedürü silmek için sözdizimi -
DROP PROCEDURE procedure-name;
Aşağıdaki ifadeyi kullanarak selamlama prosedürünü bırakabilirsiniz -
DROP PROCEDURE greetings;
PL / SQL Alt Programlarında Parametre Modları
Aşağıdaki tablo PL / SQL alt programlarındaki parametre modlarını listelemektedir -
S.No | Parametre Modu ve Açıklaması |
---|---|
1 | IN Bir IN parametresi, alt programa bir değer iletmenizi sağlar. It is a read-only parameter. Alt programın içinde, bir IN parametresi bir sabit gibi davranır. Bir değer atanamaz. IN parametresi olarak sabit, değişmez, başlatılmış bir değişken veya ifade iletebilirsiniz. Ayrıca varsayılan bir değere de başlatabilirsiniz; ancak bu durumda, alt program çağrısından çıkarılır.It is the default mode of parameter passing. Parameters are passed by reference. |
2 | OUT OUT parametresi, çağıran programa bir değer döndürür. Alt programın içinde, bir OUT parametresi bir değişken gibi davranır. Değerini değiştirebilir ve değeri atadıktan sonra referans alabilirsiniz.The actual parameter must be variable and it is passed by value. |
3 | IN OUT Bir IN OUTparametresi bir alt programa bir başlangıç değeri iletir ve arayana güncellenmiş bir değer döndürür. Bir değer atanabilir ve değer okunabilir. Bir IN OUT resmi parametresine karşılık gelen gerçek parametre, sabit veya ifade değil, değişken olmalıdır. Biçimsel parametreye bir değer atanmalıdır.Actual parameter is passed by value. |
IN & OUT Modu Örnek 1
Bu program minimum iki değeri bulur. Burada prosedür, IN modunu kullanarak iki sayı alır ve OUT parametrelerini kullanarak minimum sayılarını döndürür.
DECLARE
a number;
b number;
c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS
BEGIN
IF x < y THEN
z:= x;
ELSE
z:= y;
END IF;
END;
BEGIN
a:= 23;
b:= 45;
findMin(a, b, c);
dbms_output.put_line(' Minimum of (23, 45) : ' || c);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Minimum of (23, 45) : 23
PL/SQL procedure successfully completed.
IN & OUT Modu Örnek 2
Bu prosedür, geçirilen bir değerin değerinin karesini hesaplar. Bu örnek, bir değeri kabul etmek ve ardından başka bir sonuç döndürmek için aynı parametreyi nasıl kullanabileceğimizi gösterir.
DECLARE
a number;
PROCEDURE squareNum(x IN OUT number) IS
BEGIN
x := x * x;
END;
BEGIN
a:= 23;
squareNum(a);
dbms_output.put_line(' Square of (23): ' || a);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Square of (23): 529
PL/SQL procedure successfully completed.
Parametreleri Geçirme Yöntemleri
Gerçek parametreler üç şekilde aktarılabilir -
- Konumsal gösterim
- Adlı gösterim
- Karışık gösterim
Konumsal Gösterim
Konumsal gösterimde prosedürü şu şekilde çağırabilirsiniz:
findMin(a, b, c, d);
Konumsal gösterimde, ilk gerçek parametre, ilk biçimsel parametrenin yerine geçer; ikinci gerçek parametre, ikinci biçimsel parametrenin yerine geçer ve bu böyle devam eder. Yani,a yerine x, b yerine y, c yerine z ve d yerine m.
Adlı Gösterim
Adlandırılmış gösterimde, gerçek parametre biçimsel parametre ile ilişkilendirilir. arrow symbol ( => ). Prosedür çağrısı aşağıdaki gibi olacaktır -
findMin(x => a, y => b, z => c, m => d);
Karışık Gösterim
Karışık gösterimde, prosedür çağrısında her iki gösterimi de karıştırabilirsiniz; ancak konumsal gösterim, adlandırılmış gösterimden önce gelmelidir.
Aşağıdaki çağrı yasaldır -
findMin(a, b, c, m => d);
Ancak bu yasal değildir:
findMin(x => a, b, c, d);
Bu bölümde, PL / SQL'deki fonksiyonları tartışacağız. Bir fonksiyon, bir değer döndürmesi dışında prosedürle aynıdır. Bu nedenle, önceki bölümdeki tüm tartışmalar işlevler için de geçerlidir.
Bir Fonksiyon Oluşturmak
Kullanılarak bağımsız bir işlev oluşturulur. CREATE FUNCTIONBeyan. İçin basitleştirilmiş sözdizimiCREATE OR REPLACE PROCEDURE ifade aşağıdaki gibidir -
CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
RETURN return_datatype
{IS | AS}
BEGIN
< function_body >
END [function_name];
Nerede,
işlev adı , işlevin adını belirtir.
[VEYA DEĞİŞTİR] seçeneği, mevcut bir işlevin değiştirilmesine izin verir.
İsteğe bağlı parametre listesi, parametrelerin adını, modunu ve türlerini içerir. IN, dışarıdan iletilecek değeri ve OUT prosedürün dışında bir değer döndürmek için kullanılacak parametreyi temsil eder.
İşlev, bir return Beyan.
DÖNÜŞ fıkra verileri işlevinden dönmek için gidiyoruz yazın belirtir.
function-body çalıştırılabilir parçayı içerir.
AS anahtar sözcüğü, bağımsız bir işlev oluşturmak için IS anahtar sözcüğü yerine kullanılır.
Misal
Aşağıdaki örnek, bağımsız bir işlevin nasıl oluşturulacağını ve çağrılacağını gösterir. Bu işlev, müşteriler tablosundaki toplam MÜŞTERİ sayısını döndürür.
PL / SQL Değişkenleri bölümünde oluşturduğumuz MÜŞTERİLER tablosunu kullanacağız -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
CREATE OR REPLACE FUNCTION totalCustomers
RETURN number IS
total number(2) := 0;
BEGIN
SELECT count(*) into total
FROM customers;
RETURN total;
END;
/
Yukarıdaki kod SQL istemi kullanılarak yürütüldüğünde, aşağıdaki sonucu üretecektir -
Function created.
Bir Fonksiyon Çağırma
Bir işlev oluştururken, işlevin ne yapması gerektiğine dair bir tanım verirsiniz. Bir işlevi kullanmak için, tanımlanan görevi gerçekleştirmek üzere o işlevi çağırmanız gerekir. Bir program bir işlevi çağırdığında, program kontrolü çağrılan işleve aktarılır.
Çağrılan bir işlev, tanımlanan görevi ve return ifadesi yürütüldüğünde veya last end statement ulaşıldığında program kontrolünü ana programa geri döndürür.
Bir işlevi çağırmak için, gerekli parametreleri işlev adıyla birlikte iletmeniz yeterlidir ve işlev bir değer döndürürse, döndürülen değeri saklayabilirsiniz. Aşağıdaki program işlevi çağırırtotalCustomers anonim bir bloktan -
DECLARE
c number(2);
BEGIN
c := totalCustomers();
dbms_output.put_line('Total no. of Customers: ' || c);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Total no. of Customers: 6
PL/SQL procedure successfully completed.
Misal
Aşağıdaki örnek, maksimum iki değeri hesaplayan ve döndüren Basit bir PL / SQL İşlevini Bildirme, Tanımlama ve Çağırma gösterir.
DECLARE
a number;
b number;
c number;
FUNCTION findMax(x IN number, y IN number)
RETURN number
IS
z number;
BEGIN
IF x > y THEN
z:= x;
ELSE
Z:= y;
END IF;
RETURN z;
END;
BEGIN
a:= 23;
b:= 45;
c := findMax(a, b);
dbms_output.put_line(' Maximum of (23,45): ' || c);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Maximum of (23,45): 45
PL/SQL procedure successfully completed.
PL / SQL Özyinelemeli İşlevler
Bir programın veya alt programın başka bir alt programı çağırabileceğini gördük. Bir alt program kendisini çağırdığında, buna özyinelemeli çağrı denir ve süreçrecursion.
Kavramı açıklamak için bir sayının faktöriyelini hesaplayalım. Bir sayının faktöriyeli n olarak tanımlanır -
n! = n*(n-1)!
= n*(n-1)*(n-2)!
...
= n*(n-1)*(n-2)*(n-3)... 1
Aşağıdaki program, kendisini yinelemeli olarak arayarak belirli bir sayının faktöriyelini hesaplar -
DECLARE
num number;
factorial number;
FUNCTION fact(x number)
RETURN number
IS
f number;
BEGIN
IF x=0 THEN
f := 1;
ELSE
f := x * fact(x-1);
END IF;
RETURN f;
END;
BEGIN
num:= 6;
factorial := fact(num);
dbms_output.put_line(' Factorial '|| num || ' is ' || factorial);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Factorial 6 is 720
PL/SQL procedure successfully completed.
Bu bölümde, imleçleri PL / SQL'deki tartışacağız. Oracle, bir SQL ifadesini işlemek için bağlam alanı olarak bilinen ve ifadeyi işlemek için gereken tüm bilgileri içeren bir bellek alanı oluşturur; örneğin, işlenen satır sayısı vb.
Bir cursorbu bağlam alanına bir göstericidir. PL / SQL, bağlam alanını bir imleç aracılığıyla kontrol eder. Bir imleç, bir SQL ifadesi tarafından döndürülen satırları (bir veya daha fazla) tutar. İmlecin tuttuğu satır kümesineactive set.
Bir imleci adlandırabilirsiniz, böylece bir programda, SQL deyimi tarafından döndürülen satırları birer birer almak ve işlemek için başvurulabilir. İki tür imleç vardır -
- Örtülü imleçler
- Açık imleçler
Örtülü İmleçler
Örtük imleçler, bir SQL ifadesi çalıştırıldığında, ifade için açık bir imleç olmadığında Oracle tarafından otomatik olarak oluşturulur. Programcılar örtük imleçleri ve içindeki bilgileri kontrol edemez.
Bir DML ifadesi (INSERT, UPDATE ve DELETE) her yayınlandığında, bu ifadeyle örtük bir imleç ilişkilendirilir. INSERT işlemleri için imleç, eklenmesi gereken verileri tutar. GÜNCELLEME ve SİLME işlemleri için, imleç etkilenecek satırları tanımlar.
PL / SQL'de, en son örtük imlece şu şekilde başvurabilirsiniz: SQL cursor, her zaman gibi özelliklere sahip olan %FOUND, %ISOPEN, %NOTFOUND, ve %ROWCOUNT. SQL imlecinin ek özellikleri vardır,%BULK_ROWCOUNT ve %BULK_EXCEPTIONSile kullanılmak üzere tasarlanmıştır FORALLBeyan. Aşağıdaki tablo en çok kullanılan özniteliklerin açıklamasını sağlar -
S.No | Öznitelik ve Açıklama |
---|---|
1 | %FOUND INSERT, UPDATE veya DELETE ifadesi bir veya daha fazla satırı etkilediyse veya SELECT INTO ifadesi bir veya daha fazla satır döndürdüyse TRUE döndürür. Aksi takdirde YANLIŞ döndürür. |
2 | %NOTFOUND % FOUND'un mantıksal tersi. INSERT, UPDATE veya DELETE ifadesi hiçbir satırı etkilemezse veya SELECT INTO ifadesi satır döndürmezse TRUE döndürür. Aksi takdirde YANLIŞ döndürür. |
3 | %ISOPEN Örtük imleçler için her zaman FALSE döndürür, çünkü Oracle, ilişkili SQL deyimini çalıştırdıktan sonra SQL imlecini otomatik olarak kapatır. |
4 | %ROWCOUNT INSERT, UPDATE veya DELETE ifadesinden etkilenen veya SELECT INTO ifadesiyle döndürülen satır sayısını döndürür. |
Herhangi bir SQL imleç özniteliğine şu şekilde erişilecektir: sql%attribute_name aşağıdaki örnekte gösterildiği gibi.
Misal
Önceki bölümlerde oluşturduğumuz ve kullandığımız MÜŞTERİLER tablosunu kullanacağız.
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
Aşağıdaki program tabloyu güncelleyecek ve her müşterinin maaşını 500 artıracak ve SQL%ROWCOUNT etkilenen satır sayısını belirlemek için özellik -
DECLARE
total_rows number(2);
BEGIN
UPDATE customers
SET salary = salary + 500;
IF sql%notfound THEN
dbms_output.put_line('no customers selected');
ELSIF sql%found THEN
total_rows := sql%rowcount;
dbms_output.put_line( total_rows || ' customers selected ');
END IF;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
6 customers selected
PL/SQL procedure successfully completed.
Müşteriler tablosundaki kayıtları kontrol ederseniz, satırların güncellendiğini göreceksiniz -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2500.00 |
| 2 | Khilan | 25 | Delhi | 2000.00 |
| 3 | kaushik | 23 | Kota | 2500.00 |
| 4 | Chaitali | 25 | Mumbai | 7000.00 |
| 5 | Hardik | 27 | Bhopal | 9000.00 |
| 6 | Komal | 22 | MP | 5000.00 |
+----+----------+-----+-----------+----------+
Açık İmleçler
Açık imleçler, üzerinde daha fazla kontrol elde etmek için programcı tanımlı imleçlerdir. context area. PL / SQL Bloğunun bildirim bölümünde açık bir imleç tanımlanmalıdır. Birden fazla satır döndüren bir SELECT İfadesi üzerinde oluşturulur.
Açık bir imleç oluşturmanın sözdizimi -
CURSOR cursor_name IS select_statement;
Açık bir imleçle çalışmak aşağıdaki adımları içerir -
- Hafızayı başlatmak için imlecin bildirilmesi
- Hafızayı ayırmak için imleci açma
- Verileri almak için imleci getirme
- Ayrılan belleği serbest bırakmak için imleci kapatma
İmleci Bildirmek
İmlecin bildirilmesi, imleci bir ad ve ilişkili SELECT deyimi ile tanımlar. Örneğin -
CURSOR c_customers IS
SELECT id, name, address FROM customers;
İmleci Açma
İmleci açmak, imleç için hafızayı tahsis eder ve onu, SQL ifadesi tarafından döndürülen satırların içine getirilmesi için hazır hale getirir. Örneğin, yukarıda tanımlanan imleci aşağıdaki gibi açacağız -
OPEN c_customers;
İmleci Getirme
İmleci getirmek, her seferinde bir satıra erişmeyi içerir. Örneğin, yukarıda açılan imleçten aşağıdaki gibi satırları getireceğiz -
FETCH c_customers INTO c_id, c_name, c_addr;
İmleci Kapatma
İmlecin kapatılması, tahsis edilen hafızanın serbest bırakılması anlamına gelir. Örneğin, yukarıda açılan imleci aşağıdaki gibi kapatacağız -
CLOSE c_customers;
Misal
Aşağıda, açık imleçler & minua; kavramlarını göstermek için eksiksiz bir örnek verilmiştir.
DECLARE
c_id customers.id%type;
c_name customer.name%type;
c_addr customers.address%type;
CURSOR c_customers is
SELECT id, name, address FROM customers;
BEGIN
OPEN c_customers;
LOOP
FETCH c_customers into c_id, c_name, c_addr;
EXIT WHEN c_customers%notfound;
dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
END LOOP;
CLOSE c_customers;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
1 Ramesh Ahmedabad
2 Khilan Delhi
3 kaushik Kota
4 Chaitali Mumbai
5 Hardik Bhopal
6 Komal MP
PL/SQL procedure successfully completed.
Bu bölümde, PL / SQL'deki Kayıtları tartışacağız. Birrecordfarklı türdeki veri öğelerini tutabilen bir veri yapısıdır. Kayıtlar, veritabanı tablosunun bir satırına benzer şekilde farklı alanlardan oluşur.
Örneğin, kitaplarınızı bir kütüphanede takip etmek istiyorsunuz. Başlık, Yazar, Konu, Kitap Kimliği gibi her kitapla ilgili aşağıdaki öznitelikleri takip etmek isteyebilirsiniz. Bu öğelerin her biri için bir alan içeren bir kayıt, KİTABI mantıksal bir birim olarak ele almanıza ve bilgilerini daha iyi bir şekilde düzenlemenize ve göstermenize olanak tanır.
PL / SQL aşağıdaki kayıt türlerini işleyebilir -
- Table-based
- İmleç tabanlı kayıtlar
- Kullanıcı tanımlı kayıtlar
Tablo Tabanlı Kayıtlar
% ROWTYPE özelliği, bir programcının table-based ve cursorbased kayıtları.
Aşağıdaki örnek şu kavramını göstermektedir: table-basedkayıtları. Önceki bölümlerde oluşturduğumuz ve kullandığımız MÜŞTERİLER tablosunu kullanacağız -
DECLARE
customer_rec customers%rowtype;
BEGIN
SELECT * into customer_rec
FROM customers
WHERE id = 5;
dbms_output.put_line('Customer ID: ' || customer_rec.id);
dbms_output.put_line('Customer Name: ' || customer_rec.name);
dbms_output.put_line('Customer Address: ' || customer_rec.address);
dbms_output.put_line('Customer Salary: ' || customer_rec.salary);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Customer ID: 5
Customer Name: Hardik
Customer Address: Bhopal
Customer Salary: 9000
PL/SQL procedure successfully completed.
İmleç Bazlı Kayıtlar
Aşağıdaki örnek şu kavramını göstermektedir: cursor-basedkayıtları. Önceki bölümlerde oluşturduğumuz ve kullandığımız MÜŞTERİLER tablosunu kullanacağız -
DECLARE
CURSOR customer_cur is
SELECT id, name, address
FROM customers;
customer_rec customer_cur%rowtype;
BEGIN
OPEN customer_cur;
LOOP
FETCH customer_cur into customer_rec;
EXIT WHEN customer_cur%notfound;
DBMS_OUTPUT.put_line(customer_rec.id || ' ' || customer_rec.name);
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
1 Ramesh
2 Khilan
3 kaushik
4 Chaitali
5 Hardik
6 Komal
PL/SQL procedure successfully completed.
Kullanıcı Tanımlı Kayıtlar
PL / SQL, farklı kayıt yapılarını tanımlamanıza izin veren kullanıcı tanımlı bir kayıt türü sağlar. Bu kayıtlar farklı alanlardan oluşur. Kitaplarınızı bir kütüphanede takip etmek istediğinizi varsayalım. Her kitapla ilgili aşağıdaki öznitelikleri izlemek isteyebilirsiniz -
- Title
- Author
- Subject
- Kitap kimliği
Bir Kayıt Tanımlama
Kayıt türü şu şekilde tanımlanır -
TYPE
type_name IS RECORD
( field_name1 datatype1 [NOT NULL] [:= DEFAULT EXPRESSION],
field_name2 datatype2 [NOT NULL] [:= DEFAULT EXPRESSION],
...
field_nameN datatypeN [NOT NULL] [:= DEFAULT EXPRESSION);
record-name type_name;
Kitap kaydı aşağıdaki şekilde ilan edilir -
DECLARE
TYPE books IS RECORD
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
Alanlara Erişim
Bir kaydın herhangi bir alanına erişmek için nokta (.)Şebeke. Üye erişim operatörü, kayıt değişkeni adı ile erişmek istediğimiz alan arasında bir süre olarak kodlanır. Aşağıda, kaydın kullanımını açıklamak için bir örnek verilmiştir -
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Print book 1 record
dbms_output.put_line('Book 1 title : '|| book1.title);
dbms_output.put_line('Book 1 author : '|| book1.author);
dbms_output.put_line('Book 1 subject : '|| book1.subject);
dbms_output.put_line('Book 1 book_id : ' || book1.book_id);
-- Print book 2 record
dbms_output.put_line('Book 2 title : '|| book2.title);
dbms_output.put_line('Book 2 author : '|| book2.author);
dbms_output.put_line('Book 2 subject : '|| book2.subject);
dbms_output.put_line('Book 2 book_id : '|| book2.book_id);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
PL/SQL procedure successfully completed.
Alt Program Parametreleri Olarak Kayıtlar
Bir kaydı, diğer herhangi bir değişkeni ilettiğiniz gibi, bir alt program parametresi olarak geçirebilirsiniz. Kayıt alanlarına, yukarıdaki örnekte eriştiğiniz şekilde de erişebilirsiniz -
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
PROCEDURE printbook (book books) IS
BEGIN
dbms_output.put_line ('Book title : ' || book.title);
dbms_output.put_line('Book author : ' || book.author);
dbms_output.put_line( 'Book subject : ' || book.subject);
dbms_output.put_line( 'Book book_id : ' || book.book_id);
END;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Use procedure to print book info
printbook(book1);
printbook(book2);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
PL/SQL procedure successfully completed.
Bu bölümde, PL / SQL'deki İstisnaları tartışacağız. İstisna, bir programın yürütülmesi sırasındaki bir hata durumudur. PL / SQL, programcıların bu tür koşulları yakalamasını destekler.EXCEPTIONprogramdaki blok ve hata durumuna karşı uygun bir işlem yapılır. İki tür istisna vardır -
- Sistem tanımlı istisnalar
- Kullanıcı tanımlı istisnalar
Özel Durum İşleme için Sözdizimi
İstisna işleme için genel sözdizimi aşağıdaki gibidir. Burada işleyebileceğiniz kadar çok istisnayı listeleyebilirsiniz. Varsayılan istisna kullanılarak ele alınacaktırWHEN others THEN -
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
Misal
Kavramı açıklamak için bir kod yazalım. Önceki bölümlerde oluşturduğumuz ve kullandığımız MÜŞTERİLER tablosunu kullanacağız -
DECLARE
c_id customers.id%type := 8;
c_name customerS.Name%type;
c_addr customers.address%type;
BEGIN
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
No such customer!
PL/SQL procedure successfully completed.
Yukarıdaki program, kimliği verilen bir müşterinin adını ve adresini gösterir. Veritabanımızda ID değeri 8 olan bir müşteri olmadığı için, program çalışma zamanı istisnasını yükseltirNO_DATA_FOUND, içinde yakalanan EXCEPTION block.
İstisnaları Artırma
Herhangi bir dahili veritabanı hatası olduğunda, veritabanı sunucusu tarafından istisnalar otomatik olarak ortaya çıkar, ancak istisnalar, komut kullanılarak programcı tarafından açıkça ortaya çıkarılabilir. RAISE. Aşağıda, bir istisna oluşturmak için basit sözdizimi verilmiştir -
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
You can use the above syntax in raising the Oracle standard exception or any user-defined exception. In the next section, we will give you an example on raising a user-defined exception. You can raise the Oracle standard exceptions in a similar way.
User-defined Exceptions
PL/SQL allows you to define your own exceptions according to the need of your program. A user-defined exception must be declared and then raised explicitly, using either a RAISE statement or the procedure DBMS_STANDARD.RAISE_APPLICATION_ERROR.
The syntax for declaring an exception is −
DECLARE
my-exception EXCEPTION;
Example
The following example illustrates the concept. This program asks for a customer ID, when the user enters an invalid ID, the exception invalid_id is raised.
DECLARE
c_id customers.id%type := &cc_id;
c_name customerS.Name%type;
c_addr customers.address%type;
-- user defined exception
ex_invalid_id EXCEPTION;
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END IF;
EXCEPTION
WHEN ex_invalid_id THEN
dbms_output.put_line('ID must be greater than zero!');
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Enter value for cc_id: -6 (let's enter a value -6)
old 2: c_id customers.id%type := &cc_id;
new 2: c_id customers.id%type := -6;
ID must be greater than zero!
PL/SQL procedure successfully completed.
Pre-defined Exceptions
PL/SQL provides many pre-defined exceptions, which are executed when any database rule is violated by a program. For example, the predefined exception NO_DATA_FOUND is raised when a SELECT INTO statement returns no rows. The following table lists few of the important pre-defined exceptions −
Exception | Oracle Error | SQLCODE | Description |
---|---|---|---|
ACCESS_INTO_NULL | 06530 | -6530 | It is raised when a null object is automatically assigned a value. |
CASE_NOT_FOUND | 06592 | -6592 | It is raised when none of the choices in the WHEN clause of a CASE statement is selected, and there is no ELSE clause. |
COLLECTION_IS_NULL | 06531 | -6531 | It is raised when a program attempts to apply collection methods other than EXISTS to an uninitialized nested table or varray, or the program attempts to assign values to the elements of an uninitialized nested table or varray. |
DUP_VAL_ON_INDEX | 00001 | -1 | It is raised when duplicate values are attempted to be stored in a column with unique index. |
INVALID_CURSOR | 01001 | -1001 | It is raised when attempts are made to make a cursor operation that is not allowed, such as closing an unopened cursor. |
INVALID_NUMBER | 01722 | -1722 | It is raised when the conversion of a character string into a number fails because the string does not represent a valid number. |
LOGIN_DENIED | 01017 | -1017 | It is raised when a program attempts to log on to the database with an invalid username or password. |
NO_DATA_FOUND | 01403 | +100 | It is raised when a SELECT INTO statement returns no rows. |
NOT_LOGGED_ON | 01012 | -1012 | It is raised when a database call is issued without being connected to the database. |
PROGRAM_ERROR | 06501 | -6501 | It is raised when PL/SQL has an internal problem. |
ROWTYPE_MISMATCH | 06504 | -6504 | It is raised when a cursor fetches value in a variable having incompatible data type. |
SELF_IS_NULL | 30625 | -30625 | It is raised when a member method is invoked, but the instance of the object type was not initialized. |
STORAGE_ERROR | 06500 | -6500 | It is raised when PL/SQL ran out of memory or memory was corrupted. |
TOO_MANY_ROWS | 01422 | -1422 | It is raised when a SELECT INTO statement returns more than one row. |
VALUE_ERROR | 06502 | -6502 | It is raised when an arithmetic, conversion, truncation, or sizeconstraint error occurs. |
ZERO_DIVIDE | 01476 | 1476 | It is raised when an attempt is made to divide a number by zero. |
In this chapter, we will discuss Triggers in PL/SQL. Triggers are stored programs, which are automatically executed or fired when some events occur. Triggers are, in fact, written to be executed in response to any of the following events −
A database manipulation (DML) statement (DELETE, INSERT, or UPDATE)
A database definition (DDL) statement (CREATE, ALTER, or DROP).
A database operation (SERVERERROR, LOGON, LOGOFF, STARTUP, or SHUTDOWN).
Triggers can be defined on the table, view, schema, or database with which the event is associated.
Benefits of Triggers
Triggers can be written for the following purposes −
- Generating some derived column values automatically
- Enforcing referential integrity
- Event logging and storing information on table access
- Auditing
- Synchronous replication of tables
- Imposing security authorizations
- Preventing invalid transactions
Creating Triggers
The syntax for creating a trigger is −
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
Declaration-statements
BEGIN
Executable-statements
EXCEPTION
Exception-handling-statements
END;
Where,
CREATE [OR REPLACE] TRIGGER trigger_name − Creates or replaces an existing trigger with the trigger_name.
{BEFORE | AFTER | INSTEAD OF} − This specifies when the trigger will be executed. The INSTEAD OF clause is used for creating trigger on a view.
{INSERT [OR] | UPDATE [OR] | DELETE} − This specifies the DML operation.
[OF col_name] − This specifies the column name that will be updated.
[ON table_name] − This specifies the name of the table associated with the trigger.
[REFERENCING OLD AS o NEW AS n] − This allows you to refer new and old values for various DML statements, such as INSERT, UPDATE, and DELETE.
[FOR EACH ROW] − This specifies a row-level trigger, i.e., the trigger will be executed for each row being affected. Otherwise the trigger will execute just once when the SQL statement is executed, which is called a table level trigger.
WHEN (condition) − This provides a condition for rows for which the trigger would fire. This clause is valid only for row-level triggers.
Misal
Başlangıç olarak, önceki bölümlerde oluşturduğumuz ve kullandığımız MÜŞTERİLER tablosunu kullanacağız -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
Aşağıdaki program bir row-levelMÜŞTERİLER tablosunda gerçekleştirilen INSERT veya UPDATE veya DELETE işlemleri için tetikleyen müşteriler tablosu için tetikleyici. Bu tetikleyici, eski değerler ile yeni değerler arasındaki maaş farkını gösterecektir -
CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :NEW.salary - :OLD.salary;
dbms_output.put_line('Old salary: ' || :OLD.salary);
dbms_output.put_line('New salary: ' || :NEW.salary);
dbms_output.put_line('Salary difference: ' || sal_diff);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Trigger created.
Aşağıdaki noktaların burada dikkate alınması gerekir -
ESKİ ve YENİ referanslar tablo düzeyindeki tetikleyiciler için kullanılamaz, bunun yerine bunları kayıt düzeyindeki tetikleyiciler için kullanabilirsiniz.
Tabloyu aynı tetikleyicide sorgulamak istiyorsanız, AFTER anahtar sözcüğünü kullanmalısınız, çünkü tetikleyiciler tabloyu sorgulayabilir veya yalnızca ilk değişiklikler uygulandıktan ve tablo tutarlı bir duruma geldikten sonra yeniden değiştirebilir.
Yukarıdaki tetikleyici, tablodaki herhangi bir DELETE veya INSERT veya UPDATE işleminden önce tetiklenecek şekilde yazılmıştır, ancak tetikleyicinizi tek veya birden fazla işlem üzerine yazabilirsiniz, örneğin, bir kayıt olduğunda tetiklenecek SİLMEDEN ÖNCE tablodaki DELETE işlemi kullanılarak silinecek.
Bir Tetikleyicinin Tetiklenmesi
MÜŞTERİLER tablosunda bazı DML işlemlerini gerçekleştirelim. İşte tabloda yeni bir kayıt oluşturacak bir INSERT ifadesi -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Kriti', 22, 'HP', 7500.00 );
CUSTOMERS tablosunda bir kayıt oluşturulduğunda, yukarıdaki tetikleyici oluşturur, display_salary_changes kovulacak ve aşağıdaki sonucu gösterecektir -
Old salary:
New salary: 7500
Salary difference:
Bu yeni bir rekor olduğu için eski maaş mevcut değildir ve yukarıdaki sonuç boş olarak gelir. Şimdi CUSTOMERS tablosunda bir DML işlemi daha gerçekleştirelim. UPDATE ifadesi tablodaki mevcut bir kaydı güncelleyecektir -
UPDATE customers
SET salary = salary + 500
WHERE id = 2;
CUSTOMERS tablosunda bir kayıt güncellendiğinde, yukarıdaki tetikleyici oluşturur, display_salary_changes kovulacak ve aşağıdaki sonucu gösterecektir -
Old salary: 1500
New salary: 2000
Salary difference: 500
Bu bölümde, PL / SQL'deki Paketleri tartışacağız. Paketler, mantıksal olarak ilişkili PL / SQL türlerini, değişkenleri ve alt programları gruplayan şema nesneleridir.
Bir paketin iki zorunlu bölümü olacaktır -
- Paket özellikleri
- Paket gövdesi veya tanımı
Paket Özellikleri
Spesifikasyon, paketin arayüzüdür. Bu sadeceDECLARESpaketin dışından referans alınabilecek türler, değişkenler, sabitler, istisnalar, imleçler ve alt programlar. Başka bir deyişle, paketin içeriğiyle ilgili tüm bilgileri içerir, ancak alt programların kodunu hariç tutar.
Spesifikasyona yerleştirilen tüm nesneler publicnesneler. Paket spesifikasyonunda olmayan ancak paket gövdesinde kodlanmış herhangi bir alt programaprivate nesne.
Aşağıdaki kod parçacığı, tek bir prosedüre sahip olan bir paket özelliğini gösterir. Bir paket içinde tanımlanmış birçok global değişkene ve birden çok prosedüre veya işleve sahip olabilirsiniz.
CREATE PACKAGE cust_sal AS
PROCEDURE find_sal(c_id customers.id%type);
END cust_sal;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Package created.
Paket Gövdesi
Paket gövdesi, paket spesifikasyonunda ve diğer özel bildirimlerde belirtilen çeşitli yöntemler için kodlara sahiptir ve bunlar paketin dışındaki koddan gizlenmiştir.
CREATE PACKAGE BODYİfade, paket gövdesini oluşturmak için kullanılır. Aşağıdaki kod parçacığı için paket gövdesi bildirimini gösterir.cust_salyukarıda oluşturulmuş paket. PL / SQL - Değişkenler bölümünde bahsedildiği gibi veritabanımızda zaten MÜŞTERİLER tablosu oluşturduğumuzu varsaydım .
CREATE OR REPLACE PACKAGE BODY cust_sal AS
PROCEDURE find_sal(c_id customers.id%TYPE) IS
c_sal customers.salary%TYPE;
BEGIN
SELECT salary INTO c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line('Salary: '|| c_sal);
END find_sal;
END cust_sal;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Package body created.
Paket Öğelerini Kullanma
Paket öğelerine (değişkenler, prosedürler veya işlevler) aşağıdaki sözdizimi ile erişilir -
package_name.element_name;
Yukarıdaki paketi veritabanı şemamızda zaten oluşturduk, aşağıdaki program şunu kullanıyor: find_sal yöntemi cust_sal paket -
DECLARE
code customers.id%type := &cc_id;
BEGIN
cust_sal.find_sal(code);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, müşteri kimliğini girmenizi ister ve bir kimlik girdiğinizde, karşılık gelen maaşı aşağıdaki gibi görüntüler -
Enter value for cc_id: 1
Salary: 3000
PL/SQL procedure successfully completed.
Misal
Aşağıdaki program daha eksiksiz bir paket sağlar. Veritabanımızda saklanan MÜŞTERİLER tablosunu aşağıdaki kayıtlarla kullanacağız -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 3000.00 |
| 2 | Khilan | 25 | Delhi | 3000.00 |
| 3 | kaushik | 23 | Kota | 3000.00 |
| 4 | Chaitali | 25 | Mumbai | 7500.00 |
| 5 | Hardik | 27 | Bhopal | 9500.00 |
| 6 | Komal | 22 | MP | 5500.00 |
+----+----------+-----+-----------+----------+
Paket Özellikleri
CREATE OR REPLACE PACKAGE c_package AS
-- Adds a customer
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type);
-- Removes a customer
PROCEDURE delCustomer(c_id customers.id%TYPE);
--Lists all customers
PROCEDURE listCustomer;
END c_package;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, yukarıdaki paketi oluşturur ve aşağıdaki sonucu görüntüler -
Package created.
Paket Gövdesinin Oluşturulması
CREATE OR REPLACE PACKAGE BODY c_package AS
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type)
IS
BEGIN
INSERT INTO customers (id,name,age,address,salary)
VALUES(c_id, c_name, c_age, c_addr, c_sal);
END addCustomer;
PROCEDURE delCustomer(c_id customers.id%type) IS
BEGIN
DELETE FROM customers
WHERE id = c_id;
END delCustomer;
PROCEDURE listCustomer IS
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list is TABLE OF customers.Name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter));
END LOOP;
END listCustomer;
END c_package;
/
Yukarıdaki örnek, nested table. Bir sonraki bölümde iç içe geçmiş tablo kavramını tartışacağız.
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Package body created.
Paketi Kullanma
Aşağıdaki program c_package paketinde açıklanan ve tanımlanan yöntemleri kullanır .
DECLARE
code customers.id%type:= 8;
BEGIN
c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500);
c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500);
c_package.listcustomer;
c_package.delcustomer(code);
c_package.listcustomer;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
Customer(8): Subham
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
PL/SQL procedure successfully completed
Bu bölümde, PL / SQL'deki Koleksiyonları tartışacağız. Bir koleksiyon, aynı veri türüne sahip sıralı bir öğeler grubudur. Her öğe, koleksiyondaki konumunu temsil eden benzersiz bir alt simge ile tanımlanır.
PL / SQL üç toplama türü sağlar -
- Dizine göre tablolar veya İlişkili dizi
- İç içe tablo
- Değişken boyutlu dizi veya Varray
Oracle belgeleri, her koleksiyon türü için aşağıdaki özellikleri sağlar -
Koleksiyon Türü | Eleman Sayısı | Alt Simge Türü | Yoğun veya Seyrek | Nerede Oluşturuldu | Nesne Türü Özelliği Olabilir |
---|---|---|---|---|---|
İlişkilendirilebilir dizi (veya tabloya göre dizin) | Sınırsız | Dize veya tamsayı | Ya | Yalnızca PL / SQL bloğunda | Hayır |
İç içe tablo | Sınırsız | Tamsayı | Yoğun başlar, seyrekleşebilir | Ya PL / SQL bloğunda ya da şema seviyesinde | Evet |
Değişken boyutlu dizi (Varray) | Sınırlı | Tamsayı | Daima yoğun | Ya PL / SQL bloğunda ya da şema seviyesinde | Evet |
Bölümde zaten varyantı tartıştık 'PL/SQL arrays'. Bu bölümde PL / SQL tablolarını tartışacağız.
Her iki PL / SQL tablo türü, yani indeks tabloları ve iç içe geçmiş tablolar aynı yapıya sahiptir ve satırlarına alt simge gösterimi kullanılarak erişilir. Ancak, bu iki tür tablo bir açıdan farklılık gösterir; iç içe geçmiş tablolar bir veritabanı sütununda saklanabilir ve indeksli tablolar olamaz.
Dizine Göre Tablo
Bir index-by tablo (aynı zamanda associative array) bir dizi key-valueçiftler. Her anahtar benzersizdir ve ilgili değeri bulmak için kullanılır. Anahtar, bir tamsayı veya bir dize olabilir.
Aşağıdaki söz dizimi kullanılarak bir indeks tablosu oluşturulur. Burada birindex-by tablo adlı table_nameanahtarları alt simge_türü olacak ve ilişkili değerleri eleman_türü olacaktır
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;
table_name type_name;
Misal
Aşağıdaki örnek, tamsayı değerlerini adlarla birlikte depolamak için bir tablonun nasıl oluşturulacağını gösterir ve daha sonra aynı ad listesini yazdırır.
DECLARE
TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
salary_list salary;
name VARCHAR2(20);
BEGIN
-- adding elements to the table
salary_list('Rajnish') := 62000;
salary_list('Minakshi') := 75000;
salary_list('Martin') := 100000;
salary_list('James') := 78000;
-- printing the table
name := salary_list.FIRST;
WHILE name IS NOT null LOOP
dbms_output.put_line
('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
name := salary_list.NEXT(name);
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Salary of James is 78000
Salary of Martin is 100000
Salary of Minakshi is 75000
Salary of Rajnish is 62000
PL/SQL procedure successfully completed.
Misal
Bir indeks tablosunun öğeleri de bir %ROWTYPE herhangi bir veritabanı tablosunun veya %TYPEherhangi bir veritabanı tablosu alanı. Aşağıdaki örnek kavramı göstermektedir. KullanacağızCUSTOMERS veritabanımızda şu şekilde saklanan tablo -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
select name from customers;
TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer;
name_list c_list;
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter));
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed
İç içe Tablolar
Bir nested tablerastgele sayıda eleman içeren tek boyutlu bir dizi gibidir. Bununla birlikte, iç içe geçmiş bir tablo, aşağıdaki yönlerden bir diziden farklıdır:
Bir dizinin belirtilen sayıda öğesi vardır, ancak iç içe geçmiş bir tablo yoktur. İç içe geçmiş bir tablonun boyutu dinamik olarak artabilir.
Bir dizi her zaman yoğundur, yani her zaman ardışık alt simgelere sahiptir. İç içe geçmiş bir dizi başlangıçta yoğundur, ancak ondan öğeler silindiğinde seyrekleşebilir.
Aşağıdaki sözdizimi kullanılarak iç içe geçmiş bir tablo oluşturulur -
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
Bu beyan, bir beyanname ile benzerdir. index-by masa, ama yok INDEX BY fıkra.
İç içe geçmiş bir tablo, bir veritabanı sütununda saklanabilir. Tek sütunlu bir tabloyu daha büyük bir tabloyla birleştirdiğiniz SQL işlemlerini basitleştirmek için daha fazla kullanılabilir. İlişkilendirilebilir bir dizi, veritabanında saklanamaz.
Misal
Aşağıdaki örnekler iç içe tablonun kullanımını göstermektedir -
DECLARE
TYPE names_table IS TABLE OF VARCHAR2(10);
TYPE grades IS TABLE OF INTEGER;
names names_table;
marks grades;
total integer;
BEGIN
names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i IN 1 .. total LOOP
dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
end loop;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Total 5 Students
Student:Kavita, Marks:98
Student:Pritam, Marks:97
Student:Ayan, Marks:78
Student:Rishav, Marks:87
Student:Aziz, Marks:92
PL/SQL procedure successfully completed.
Misal
Bir nested table ayrıca olabilir %ROWTYPEherhangi bir veritabanı tablosu veya herhangi bir veritabanı tablosu alanının% TYPE'ı. Aşağıdaki örnek kavramı göstermektedir. Veritabanımızda saklanan MÜŞTERİLER tablosunu şu şekilde kullanacağız:
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list IS TABLE of customerS.No.ame%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
Toplama Yöntemleri
PL / SQL, koleksiyonların kullanımını kolaylaştıran yerleşik toplama yöntemleri sağlar. Aşağıdaki tablo yöntemleri ve amaçlarını listeler -
S.No | Yöntem Adı ve Amacı |
---|---|
1 | EXISTS(n) Bir koleksiyondaki n'inci öğe varsa TRUE döndürür; aksi takdirde FALSE döndürür. |
2 | COUNT Bir koleksiyonun içerdiği öğelerin sayısını döndürür. |
3 | LIMIT Bir koleksiyonun maksimum boyutunu kontrol eder. |
4 | FIRST Tamsayı alt simgelerini kullanan bir koleksiyondaki ilk (en küçük) dizin numaralarını döndürür. |
5 | LAST Tamsayı alt simgelerini kullanan bir koleksiyondaki son (en büyük) dizin numaralarını döndürür. |
6 | PRIOR(n) Bir koleksiyondaki n dizininden önce gelen dizin numarasını döndürür. |
7 | NEXT(n) Dizin n'den sonra gelen dizin numarasını döndürür. |
8 | EXTEND Bir koleksiyona bir boş öğe ekler. |
9 | EXTEND(n) Bir koleksiyona n null öğe ekler. |
10 | EXTEND(n,i) Ekler ni'nci öğenin bir koleksiyona kopyaları . |
11 | TRIM Bir koleksiyonun sonundan bir öğeyi kaldırır. |
12 | TRIM(n) Kaldırır n bir koleksiyonun sonundaki öğeler. |
13 | DELETE COUNT değerini 0 olarak ayarlayarak bir koleksiyondaki tüm öğeleri kaldırır. |
14 | DELETE(n) Kaldırır nthsayısal anahtar veya iç içe tablo içeren bir ilişkilendirilebilir diziden öğe. İlişkilendirilebilir dizinin bir dize anahtarı varsa, anahtar değerine karşılık gelen öğe silinir. Eğern boş, DELETE(n) hiç birşey yapmıyor. |
15 | DELETE(m,n) Aralıktaki tüm öğeleri kaldırır m..nilişkilendirilebilir bir diziden veya iç içe tablodan. Eğerm daha büyük n ya da eğer m veya n boş, DELETE(m,n) hiç birşey yapmıyor. |
Koleksiyon İstisnaları
Aşağıdaki tablo koleksiyon istisnalarını ve ne zaman ortaya çıktıklarını gösterir -
Koleksiyon İstisnası | Durumlarda Yükselen |
---|---|
COLLECTION_IS_NULL | Atomik olarak boş bir koleksiyon üzerinde çalışmaya çalışırsınız. |
VERİ BULUNAMADI | Bir alt simge, silinmiş bir öğeyi veya ilişkilendirilebilir bir dizinin var olmayan bir öğesini belirtir. |
SUBSCRIPT_BEYOND_COUNT | Bir alt simge, bir koleksiyondaki öğe sayısını aşıyor. |
SUBSCRIPT_OUTSIDE_LIMIT | Bir alt simge izin verilen aralığın dışında. |
VALUE_ERROR | Bir alt simge boştur veya anahtar türüne dönüştürülemez. Bu istisna, anahtar birPLS_INTEGER aralık ve alt simge bu aralığın dışındadır. |
Bu bölümde, PL / SQL'deki işlemleri tartışacağız. Bir veritabanıtransactionbir veya daha fazla ilgili SQL deyiminden oluşabilen atomik bir çalışma birimidir. Atomik olarak adlandırılır çünkü bir işlemi oluşturan SQL deyimlerinin getirdiği veritabanı değişiklikleri toplu olarak işlenebilir, yani veritabanına kalıcı hale getirilebilir veya veritabanından geri alınabilir (geri alınabilir).
Başarıyla yürütülen bir SQL ifadesi ve taahhüt edilen bir işlem aynı değildir. Bir SQL ifadesi başarıyla yürütülse bile, ifadeyi içeren işlem taahhüt edilmediği sürece geri alınabilir ve ifadeler tarafından yapılan tüm değişiklikler geri alınabilir.
İşlem Başlatma ve Bitirme
Bir işlemde beginning ve bir end. Aşağıdaki olaylardan biri gerçekleştiğinde bir işlem başlar -
Veritabanına bağlanıldıktan sonra ilk SQL ifadesi gerçekleştirilir.
Bir işlem tamamlandıktan sonra verilen her yeni SQL ifadesinde.
Aşağıdaki olaylardan biri gerçekleştiğinde işlem sona erer -
Bir COMMIT veya a ROLLBACK beyanı yayınlandı.
Bir DDL gibi ifade CREATE TABLEbeyan verilir; çünkü bu durumda otomatik olarak bir COMMIT gerçekleştirilir.
Bir DCL gibi bir ifade GRANTbeyan verilir; çünkü bu durumda otomatik olarak bir COMMIT gerçekleştirilir.
Kullanıcı veritabanından bağlantısını keser.
Kullanıcı çıkışları SQL*PLUS yayınlayarak EXIT komutu, bir COMMIT otomatik olarak gerçekleştirilir.
SQL * Plus anormal şekilde sona eriyor, bir ROLLBACK otomatik olarak gerçekleştirilir.
Bir DMLifade başarısız; bu durumda, bu DML ifadesini geri almak için otomatik olarak bir GERİ DÖNME gerçekleştirilir.
İşlem Yapmak
COMMIT SQL komutu verilerek bir işlem kalıcı hale getirilir. COMMIT komutunun genel sözdizimi şöyledir:
COMMIT;
Örneğin,
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
COMMIT;
Geri Alma İşlemleri
COMMIT olmadan veritabanında yapılan değişiklikler, ROLLBACK komutu kullanılarak geri alınabilir.
ROLLBACK komutunun genel sözdizimi -
ROLLBACK [TO SAVEPOINT < savepoint_name>];
Sistem arızası gibi benzeri görülmemiş bir durum nedeniyle bir işlem iptal edildiğinde, bir işlemden sonraki tüm işlem otomatik olarak geri alınır. Kullanmıyorsanızsavepoint, ardından tüm değişiklikleri geri almak için aşağıdaki ifadeyi kullanın -
ROLLBACK;
Kayıt noktaları
Kayıt noktaları, bazı kontrol noktaları belirleyerek uzun bir işlemi daha küçük birimlere ayırmaya yardımcı olan bir tür işaretçilerdir. Uzun bir işlemde kayıt noktaları ayarlayarak, gerekirse bir kontrol noktasına geri dönebilirsiniz. Bu,SAVEPOINT komut.
SAVEPOINT komutunun genel sözdizimi şöyledir:
SAVEPOINT < savepoint_name >;
Örneğin
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 );
SAVEPOINT sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000;
ROLLBACK TO sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 7;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 8;
COMMIT;
ROLLBACK TO sav1 - Bu ifade, tüm değişiklikleri, kayıt noktası sav1'i işaretlediğiniz noktaya kadar geri alır.
Bundan sonra yaptığınız yeni değişiklikler başlayacaktır.
Otomatik İşlem Kontrolü
Yürütmek için COMMIT otomatik olarak INSERT, UPDATE veya DELETE komut yürütüldüğünde, AUTOCOMMIT ortam değişkeni as -
SET AUTOCOMMIT ON;
Aşağıdaki komutu kullanarak otomatik tamamlama modunu kapatabilirsiniz -
SET AUTOCOMMIT OFF;
Bu bölümde, PL / SQL'deki Tarih ve Saati tartışacağız. PL / SQL'de tarih ve saatle ilgili iki veri türü sınıfı vardır -
- Tarih ve saat veri türleri
- Aralık veri türleri
Tarih Saat veri türleri -
- DATE
- TIMESTAMP
- SAAT DİLİMİ İLE TIMESTAMP
- YEREL SAAT DİLİMİ İLE TIMESTAMP
Aralık veri türleri şunlardır -
- YILDAN AYA ARALIK
- İKİNCİYE ARALIK GÜNÜ
Tarih Saat ve Aralık Veri Türleri için Alan Değerleri
Her ikisi de datetime ve interval veri türleri oluşur fields. Bu alanların değerleri, veri türünün değerini belirler. Aşağıdaki tablo, alanları ve tarih zamanları ve aralıklar için olası değerlerini listeler.
Alan adı | Geçerli Tarih ve Saat Değerleri | Geçerli Aralık Değerleri |
---|---|---|
YIL | -4712 ila 9999 (0 yılı hariç) | Sıfır olmayan herhangi bir tam sayı |
AY | 01 - 12 | 0 ila 11 |
GÜN | 01 ila 31 (yerel ayardaki takvim kurallarına göre AY ve YIL değerleriyle sınırlıdır) | Sıfır olmayan herhangi bir tam sayı |
SAAT | 00-23 | 0-23 |
DAKİKA | 00 - 59 | 0 - 59 |
İKİNCİ | 00 - 59,9 (n), burada 9 (n), zaman kesirli saniyelerin hassasiyetidir 9 (n) bölümü DATE için geçerli değildir. |
0 - 59,9 (n), burada 9 (n), aralıklı kesirli saniye hassasiyetidir |
TIMEZONE_HOUR | -12 ila 14 (aralık, gün ışığından yararlanma saati değişikliklerini barındırır) DATE veya TIMESTAMP için geçerli değildir. |
Uygulanamaz |
TIMEZONE_MINUTE | 00 - 59 DATE veya TIMESTAMP için geçerli değildir. |
Uygulanamaz |
TIMEZONE_REGION | DATE veya TIMESTAMP için geçerli değildir. | Uygulanamaz |
TIMEZONE_ABBR | DATE veya TIMESTAMP için geçerli değildir. | Uygulanamaz |
Tarih Saat Veri Türleri ve İşlevleri
Tarih Saat veri türleri aşağıdadır -
TARİH
Tarih ve saat bilgilerini hem karakter hem de sayı veri türlerinde depolar. Yüzyıl, yıl, ay, tarih, saat, dakika ve saniye bilgilerinden oluşur. Şu şekilde belirtilir -
TIMESTAMP
DATE veri türünün bir uzantısıdır. DATE veri türünün yılını, ayını ve gününü saat, dakika ve saniye değerleriyle birlikte depolar. Kesin zaman değerlerini saklamak için kullanışlıdır.
SAAT DİLİMİ İLE TIMESTAMP
Bir saat dilimi bölge adı veya değerinde bir saat dilimi uzaklığı içeren bir TIMESTAMP varyantıdır. Saat dilimi farkı, yerel saat ile UTC arasındaki farktır (saat ve dakika olarak). Bu veri türü, coğrafi bölgeler arasında tarih bilgilerinin toplanması ve değerlendirilmesi için kullanışlıdır.
YEREL SAAT DİLİMİ İLE TIMESTAMP
Değerinde bir saat dilimi uzaklığı içeren başka bir TIMESTAMP varyantıdır.
Aşağıdaki tablo, Tarih Saat işlevlerini sağlar (burada, x, tarih saat değerine sahiptir) -
S.No | Fonksiyon Adı ve Tanımı |
---|---|
1 | ADD_MONTHS(x, y); Ekler y aylar x. |
2 | LAST_DAY(x); Ayın son gününü döndürür. |
3 | MONTHS_BETWEEN(x, y); Aradaki ayların sayısını verir x ve y. |
4 | NEXT_DAY(x, day); Sonrakinin datetime döndürür gün sonrax. |
5 | NEW_TIME; Kullanıcı tarafından belirtilen bir saat diliminden saat / gün değerini döndürür. |
6 | ROUND(x [, unit]); Mermi x. |
7 | SYSDATE(); Geçerli tarih saatini döndürür. |
8 | TRUNC(x [, unit]); Keser x. |
Zaman damgası işlevleri (burada, x bir zaman damgası değerine sahiptir) -
S.No | Fonksiyon Adı ve Tanımı |
---|---|
1 | CURRENT_TIMESTAMP(); Geçerli oturum saatini ve oturum saat dilimini içeren ZAMAN DİLİMİ İLE ZAMAN DAMGASI döndürür. |
2 | EXTRACT({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } | { TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION | } TIMEZONE_ABBR ) FROM x) Bir yıl, ay, gün, saat, dakika, saniye veya saat dilimini ayıklar ve döndürür: x. |
3 | FROM_TZ(x, time_zone); TIMESTAMP x ve time_zone ile belirtilen saat dilimini TIMEZONE İLE TIMESTAMP'a dönüştürür. |
4 | LOCALTIMESTAMP(); Oturum saat dilimindeki yerel saati içeren bir TIMESTAMP döndürür. |
5 | SYSTIMESTAMP(); Geçerli veritabanı saatiyle birlikte veritabanı saat dilimini içeren bir TIMESTAMP WITH TIME ZONE döndürür. |
6 | SYS_EXTRACT_UTC(x); TIMESTAMP WITH TIMEZONE x değerini UTC olarak tarih ve saati içeren bir TIMESTAMP’a dönüştürür. |
7 | TO_TIMESTAMP(x, [format]); X dizesini bir TIMESTAMP'a dönüştürür. |
8 | TO_TIMESTAMP_TZ(x, [format]); X dizesini TIMEZONE İLE TIMESTAMP İLE dönüştürür. |
Örnekler
Aşağıdaki kod parçacıkları, yukarıdaki işlevlerin kullanımını göstermektedir -
Example 1
SELECT SYSDATE FROM DUAL;
Output -
08/31/2012 5:25:34 PM
Example 2
SELECT TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH:MI:SS') FROM DUAL;
Output -
31-08-2012 05:26:14
Example 3
SELECT ADD_MONTHS(SYSDATE, 5) FROM DUAL;
Output -
01/31/2013 5:26:31 PM
Example 4
SELECT LOCALTIMESTAMP FROM DUAL;
Output -
8/31/2012 5:26:55.347000 PM
Aralık Veri Türleri ve İşlevleri
Aralık veri türleri aşağıdadır -
IINTERVAL YEAR TO MONTH - YEAR ve MONTH datetime alanlarını kullanarak bir süreyi depolar.
ARALIK GÜNÜ İKİNCİYE - Gün, saat, dakika ve saniye cinsinden bir süreyi kaydeder.
Aralık Fonksiyonları
S.No | Fonksiyon Adı ve Tanımı |
---|---|
1 | NUMTODSINTERVAL(x, interval_unit); X sayısını ARALIK GÜNÜ İKİNCİYE dönüştürür. |
2 | NUMTOYMINTERVAL(x, interval_unit); X sayısını INTERVAL YEAR TO AY'a dönüştürür. |
3 | TO_DSINTERVAL(x); X dizesini ARALIK GÜNÜ İKİNCİYE DÖNÜŞTÜRÜR. |
4 | TO_YMINTERVAL(x); X dizesini INTERVAL YEAR TO MONTH şeklinde dönüştürür. |
Bu bölümde, PL / SQL'deki DBMS Çıktısını tartışacağız. DBMS_OUTPUTçıktı, hata ayıklama bilgilerini görüntülemenizi ve PL / SQL bloklarından, alt programlardan, paketlerden ve tetikleyicilerden mesaj göndermenizi sağlayan yerleşik bir pakettir. Bu paketi eğitimimiz boyunca zaten kullandık.
Veritabanındaki tüm kullanıcı tablolarını görüntüleyecek küçük bir kod parçacığına bakalım. Tüm tablo adlarını listelemek için veritabanınızda deneyin -
BEGIN
dbms_output.put_line (user || ' Tables in the database:');
FOR t IN (SELECT table_name FROM user_tables)
LOOP
dbms_output.put_line(t.table_name);
END LOOP;
END;
/
DBMS_OUTPUT Alt Programları
DBMS_OUTPUT paketi aşağıdaki alt programlara sahiptir -
S.No | Alt Program ve Amaç | |
---|---|---|
1 | DBMS_OUTPUT.DISABLE; Mesaj çıktısını devre dışı bırakır. |
|
2 | DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000); Mesaj çıktısını etkinleştirir. NULL değeribuffer_size sınırsız arabellek boyutunu temsil eder. |
|
3 | DBMS_OUTPUT.GET_LINE (line OUT VARCHAR2, status OUT INTEGER); Tek satırlık arabelleğe alınmış bilgiyi alır. |
|
4 | DBMS_OUTPUT.GET_LINES (lines OUT CHARARR, numlines IN OUT INTEGER); Arabellekten bir satır dizisi alır. |
|
5 | DBMS_OUTPUT.NEW_LINE; Bir satır sonu işaretçisi koyar. |
|
6 | DBMS_OUTPUT.PUT(item IN VARCHAR2); Arabelleğe kısmi bir çizgi yerleştirir. |
|
7 | DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2); Arabelleğe bir çizgi yerleştirir. |
Misal
DECLARE
lines dbms_output.chararr;
num_lines number;
BEGIN
-- enable the buffer with default size 20000
dbms_output.enable;
dbms_output.put_line('Hello Reader!');
dbms_output.put_line('Hope you have enjoyed the tutorials!');
dbms_output.put_line('Have a great time exploring pl/sql!');
num_lines := 3;
dbms_output.get_lines(lines, num_lines);
FOR i IN 1..num_lines LOOP
dbms_output.put_line(lines(i));
END LOOP;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Hello Reader!
Hope you have enjoyed the tutorials!
Have a great time exploring pl/sql!
PL/SQL procedure successfully completed.
Bu bölümde, Nesneye Yönelik PL / SQL tartışacağız. PL / SQL, Oracle'da nesne yönelimli veritabanı tasarlamaya yardımcı olan bir nesne türü tanımlamaya izin verir. Nesne türü, bileşik türler oluşturmanıza olanak tanır. Nesnelerin kullanılması, gerçek dünya nesnelerini belirli veri yapısı ve onu çalıştırma yöntemleri ile uygulamanıza olanak tanır. Nesnelerin nitelikleri ve yöntemleri vardır. Nitelikler bir nesnenin özellikleridir ve bir nesnenin durumunu saklamak için kullanılır; davranışını modellemek için yöntemler kullanılır.
Nesneler CREATE [OR REPLACE] TYPE deyimi kullanılarak oluşturulur. Aşağıda, basit biraddress birkaç nitelikten oluşan nesne -
CREATE OR REPLACE TYPE address AS OBJECT
(house_no varchar2(10),
street varchar2(30),
city varchar2(20),
state varchar2(10),
pincode varchar2(10)
);
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type created.
Bir nesne daha oluşturalım customer nereye sarılacağız attributes ve methods birlikte nesne yönelimli hislere sahip olmak için -
CREATE OR REPLACE TYPE customer AS OBJECT
(code number(5),
name varchar2(30),
contact_no varchar2(12),
addr address,
member procedure display
);
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type created.
Bir Nesneyi Örneklemek
Bir nesne türü tanımlamak, nesne için bir plan sağlar. Bu nesneyi kullanmak için, bu nesnenin örneklerini oluşturmanız gerekir. Örnek adını kullanarak nesnenin niteliklerine ve yöntemlerine erişebilirsiniz.the access operator (.) aşağıdaki gibi -
DECLARE
residence address;
BEGIN
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
dbms_output.put_line('House No: '|| residence.house_no);
dbms_output.put_line('Street: '|| residence.street);
dbms_output.put_line('City: '|| residence.city);
dbms_output.put_line('State: '|| residence.state);
dbms_output.put_line('Pincode: '|| residence.pincode);
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
House No: 103A
Street: M.G.Road
City: Jaipur
State: Rajasthan
Pincode: 201301
PL/SQL procedure successfully completed.
Üye Yöntemleri
Member methods manipüle etmek için kullanılır attributesnesnenin. Nesne türünü bildirirken bir üye yönteminin bildirimini sağlarsınız. Nesne gövdesi, üye yöntemlerinin kodunu tanımlar. Nesne gövdesi, CREATE TYPE BODY deyimi kullanılarak oluşturulur.
Constructorsdeğeri olarak yeni bir nesne döndüren işlevlerdir. Her nesnenin sistem tanımlı bir kurucu yöntemi vardır. Yapıcının adı, nesne türüyle aynıdır. Örneğin -
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
comparison methodsnesneleri karşılaştırmak için kullanılır. Nesneleri karşılaştırmanın iki yolu vardır -
Harita yöntemi
Map methoddeğeri özniteliklerin değerine bağlı olacak şekilde uygulanan bir işlevdir. Örneğin, bir müşteri nesnesi için, müşteri kodu iki müşteri için aynıysa, her iki müşteri de aynı olabilir. Yani bu iki nesne arasındaki ilişki kodun değerine bağlı olacaktır.
Sipariş yöntemi
Order methodiki nesneyi karşılaştırmak için bazı iç mantık uygular. Örneğin, dikdörtgen bir nesne için, her iki kenarı da daha büyükse bir dikdörtgen başka bir dikdörtgenden daha büyüktür.
Harita yöntemini kullanma
Aşağıdaki dikdörtgen nesnesini kullanarak yukarıdaki kavramları anlamaya çalışalım -
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member function enlarge( inc number) return rectangle,
member procedure display,
map member function measure return number
);
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type created.
Tip gövdesinin oluşturulması -
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER FUNCTION enlarge(inc number) return rectangle IS
BEGIN
return rectangle(self.length + inc, self.width + inc);
END enlarge;
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
MAP MEMBER FUNCTION measure return number IS
BEGIN
return (sqrt(length*length + width*width));
END measure;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type body created.
Şimdi dikdörtgen nesnesini ve üye işlevlerini kullanarak -
DECLARE
r1 rectangle;
r2 rectangle;
r3 rectangle;
inc_factor number := 5;
BEGIN
r1 := rectangle(3, 4);
r2 := rectangle(5, 7);
r3 := r1.enlarge(inc_factor);
r3.display;
IF (r1 > r2) THEN -- calling measure function
r1.display;
ELSE
r2.display;
END IF;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Length: 8
Width: 9
Length: 5
Width: 7
PL/SQL procedure successfully completed.
Sipariş yöntemini kullanma
Şimdi same effect could be achieved using an order method. Dikdörtgen nesnesini bir sipariş yöntemi kullanarak yeniden oluşturalım -
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member procedure display,
order member function measure(r rectangle) return number
);
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type created.
Tip gövdesinin oluşturulması -
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
ORDER MEMBER FUNCTION measure(r rectangle) return number IS
BEGIN
IF(sqrt(self.length*self.length + self.width*self.width)>
sqrt(r.length*r.length + r.width*r.width)) then
return(1);
ELSE
return(-1);
END IF;
END measure;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type body created.
Dikdörtgen nesnesini ve üye işlevlerini kullanarak -
DECLARE
r1 rectangle;
r2 rectangle;
BEGIN
r1 := rectangle(23, 44);
r2 := rectangle(15, 17);
r1.display;
r2.display;
IF (r1 > r2) THEN -- calling measure function
r1.display;
ELSE
r2.display;
END IF;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Length: 23
Width: 44
Length: 15
Width: 17
Length: 23
Width: 44
PL/SQL procedure successfully completed.
PL / SQL Nesneleri için Kalıtım
PL / SQL, mevcut temel nesnelerden nesne oluşturmaya izin verir. Kalıtımı uygulamak için temel nesneler şu şekilde bildirilmelidir:NOT FINAL. Varsayılan,FINAL.
Aşağıdaki programlar, PL / SQL Nesnelerindeki kalıtımı göstermektedir. Adlı başka bir nesne oluşturalımTableTop, bu Rectangle nesnesinden miras alınır. Bunun için temel dikdörtgen nesnesini oluşturmamız gerekiyor -
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member function enlarge( inc number) return rectangle,
NOT FINAL member procedure display) NOT FINAL
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type created.
Temel tip gövdenin oluşturulması -
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER FUNCTION enlarge(inc number) return rectangle IS
BEGIN
return rectangle(self.length + inc, self.width + inc);
END enlarge;
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type body created.
Alt nesne masa üstü oluşturma -
CREATE OR REPLACE TYPE tabletop UNDER rectangle
(
material varchar2(20),
OVERRIDING member procedure display
)
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type created.
Alt nesne masa üstü için yazı gövdesi oluşturma
CREATE OR REPLACE TYPE BODY tabletop AS
OVERRIDING MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
dbms_output.put_line('Material: '|| material);
END display;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type body created.
Kullanılması masa nesne ve üye fonksiyonlarını -
DECLARE
t1 tabletop;
t2 tabletop;
BEGIN
t1:= tabletop(20, 10, 'Wood');
t2 := tabletop(50, 30, 'Steel');
t1.display;
t2.display;
END;
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Length: 20
Width: 10
Material: Wood
Length: 50
Width: 30
Material: Steel
PL/SQL procedure successfully completed.
PL / SQL'de Soyut Nesneler
NOT INSTANTIABLEyan tümce, bir soyut nesne bildirmenize izin verir. Soyut bir nesneyi olduğu gibi kullanamazsınız; işlevlerini kullanmak için bu tür nesnelerin bir alt türünü veya alt türünü oluşturmanız gerekecektir.
Örneğin,
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)
NOT INSTANTIABLE NOT FINAL
/
Yukarıdaki kod SQL isteminde çalıştırıldığında, aşağıdaki sonucu verir -
Type created.