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);