JDBC - Saklanan Prosedür

Nasıl kullanılacağını öğrendik Stored ProceduresJDBC'de JDBC - İfadeler bölümünü tartışırken . Bu bölüm bu bölüme benzer, ancak size JDBC SQL kaçış sözdizimi hakkında ek bilgi verecektir.

Bir Connection nesnesinin Statement ve PreparedStatement nesnelerini oluşturması gibi, aynı zamanda bir veritabanı saklı yordamına çağrı yürütmek için kullanılacak CallableStatement nesnesini de oluşturur.

CallableStatement Nesnesi Oluşturma

Diyelim ki, aşağıdaki Oracle saklı yordamını yürütmeniz gerekiyor -

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

NOTE: Yukarıdaki saklı prosedür Oracle için yazılmıştır, ancak MySQL veritabanı ile çalışıyoruz, bu nedenle, MySQL için aynı saklı prosedürü EMP veritabanında oluşturmak için aşağıdaki gibi yazalım -

DELIMITER $$

DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$

DELIMITER ;

Üç tür parametre vardır: IN, OUT ve INOUT. PreparedStatement nesnesi yalnızca IN parametresini kullanır. CallableStatement nesnesi üçünü de kullanabilir.

İşte her birinin tanımları -

Parametre Açıklama
İÇİNDE SQL ifadesi oluşturulduğunda değeri bilinmeyen bir parametre. Değerleri IN parametrelerine setXXX () yöntemleriyle bağlarsınız.
DIŞARI Değeri, döndürdüğü SQL ifadesiyle sağlanan bir parametredir. OUT parametrelerinden değerleri getXXX () yöntemleriyle alırsınız.
INOUT Hem giriş hem de çıkış değerleri sağlayan bir parametredir. Değişkenleri setXXX () yöntemleriyle bağlar ve getXXX () yöntemleriyle değerleri alırsınız.

Aşağıdaki kod parçacığı, Connection.prepareCall() bir örnekleme yöntemi CallableStatement önceki saklı yordama dayalı nesne -

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Dize değişkeni SQL, parametre yer tutucularla birlikte saklı yordamı temsil eder.

CallableStatement nesnelerini kullanmak, PreparedStatement nesnelerini kullanmaya benzer. İfadeyi çalıştırmadan önce değerleri tüm parametrelere bağlamanız gerekir, aksi takdirde bir SQLException alırsınız.

IN parametreleriniz varsa, PreparedStatement nesnesi için geçerli olan aynı kural ve teknikleri izleyin; Bağladığınız Java veri türüne karşılık gelen setXXX () yöntemini kullanın.

OUT ve INOUT parametrelerini kullandığınızda, ek bir CallableStatement yöntemi olan registerOutParameter () kullanmanız gerekir. RegisterOutParameter () yöntemi, JDBC veri türünü saklı yordamın döndürmesi beklenen veri türüne bağlar.

Depolanan yordamınızı çağırdığınızda, OUT parametresinden uygun getXXX () yöntemiyle değeri alırsınız. Bu yöntem, alınan SQL türünün değerini bir Java veri türüne çevirir.

CallableStatement Nesnesini Kapatma

Tıpkı diğer Statement nesnesini kapattığınız gibi, aynı nedenle CallableStatement nesnesini de kapatmalısınız.

Close () yöntemine yapılan basit bir çağrı işi yapacak. Önce Connection nesnesini kapatırsanız, CallableStatement nesnesini de kapatır. Ancak, düzgün temizlik sağlamak için CallableStatement nesnesini her zaman açıkça kapatmalısınız.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

Callable - Örnek Kod'da daha fazla ayrıntı inceledik .

JDBC SQL Escape Sözdizimi

Kaçış sözdizimi, standart JDBC yöntemlerini ve özelliklerini kullanarak sizin için mevcut olmayan veritabanına özgü özellikleri kullanma esnekliği sağlar.

Genel SQL kaçış sözdizimi biçimi aşağıdaki gibidir -

{keyword 'parameters'}

JDBC programlamasını gerçekleştirirken çok yararlı bulacağınız aşağıdaki kaçış dizileri:

d, t, ts Anahtar Kelimeler

Tarih, saat ve zaman damgası değişmezlerini belirlemeye yardımcı olurlar. Bildiğiniz gibi, iki DBMS saat ve tarihi aynı şekilde temsil etmez. Bu kaçış sözdizimi, sürücüye tarihi veya saati hedef veritabanı biçiminde oluşturmasını söyler. Örneğin -

{d 'yyyy-mm-dd'}

Yyyy = yıl, mm = ay olduğunda; gg = tarih. Bu sözdizimi {d '2009-09-03'} 9 Mart 2009’dur.

İşte bir tabloya tarihin nasıl EKLENECEĞİNİ gösteren basit bir örnek -

//Create a Statement object
stmt = conn.createStatement();
//Insert data ==> ID, First Name, Last Name, DOB
String sql="INSERT INTO STUDENTS VALUES" +
             "(100,'Zara','Ali', {d '2001-12-16'})";

stmt.executeUpdate(sql);

Benzer şekilde, aşağıdaki iki sözdiziminden birini kullanabilirsiniz. t veya ts -

{t 'hh:mm:ss'}

Burada hh = saat; mm = dakika; ss = saniye. Bu sözdizimini {t '13: 30: 29 '} kullanmak 1:30:29 PM'dir.

{ts 'yyyy-mm-dd hh:mm:ss'}

Bu, zaman damgasını temsil etmek için 'd' ve 't' için yukarıdaki iki söz diziminin birleşik sözdizimidir.

kaçış anahtar kelimesi

Bu anahtar sözcük LIKE yan tümcelerinde kullanılan kaçış karakterini tanımlar. Sıfır veya daha fazla karakterle eşleşen% SQL joker karakterini kullanırken faydalıdır. Örneğin -

String sql = "SELECT symbol FROM MathSymbols
              WHERE symbol LIKE '\%' {escape '\'}";
stmt.execute(sql);

Kaçış karakteri olarak ters eğik çizgi karakterini (\) kullanırsanız, ters eğik çizgi aynı zamanda bir Java kaçış karakteridir, çünkü Java Dize değişmezinde iki ters eğik çizgi karakteri kullanmanız gerekir.

fn Anahtar Kelime

Bu anahtar sözcük, bir DBMS'de kullanılan skaler işlevleri temsil eder. Örneğin, bir dizenin uzunluğunu elde etmek için SQL işlev uzunluğunu kullanabilirsiniz -

{fn length('Hello World')}

Bu, 'Merhaba Dünya' karakter dizesinin uzunluğu olan 11 değerini döndürür.

Anahtar Kelime ara

Bu anahtar sözcük, saklı yordamları çağırmak için kullanılır. Örneğin, IN parametresi gerektiren bir saklı yordam için aşağıdaki sözdizimini kullanın -

{call my_procedure(?)};

Bir IN parametresi gerektiren ve bir OUT parametresi döndüren saklı bir prosedür için aşağıdaki sözdizimini kullanın -

{? = call my_procedure(?)};

oj Anahtar Kelime

Bu anahtar kelime, dış birleşimleri belirtmek için kullanılır. Sözdizimi aşağıdaki gibidir -

{oj outer-join}

Nerede dış birleşim = tablo {SOL | SAĞ | TAM} DIŞ BİRLEŞTİR {tablo | arama koşulunda dış birleştirme}. Örneğin -

String sql = "SELECT Employees 
              FROM {oj ThisTable RIGHT
              OUTER JOIN ThatTable on id = '100'}";
stmt.execute(sql);