Java ile Oracle Stored Procedure üzerinden ResultSet almak
Merhaba sevgili manyaklar. Bu yazımızda kimimizi saatlerce uğraştırıp deli eden bir problemin çözümünü hep beraber inceleyeceğiz. (En azından lazım olunca gelip burdan bakacaz ehhe). Konumuz Oracle üzerinden stored procedure kullanarak ResultSet almak. Normalde Oracle stored procedure’leri içerisinde “SELECT * FROM HEDE” gibi bir sorgu yaparak bir sonuç kümesi dönemiyoruz. Nedense Oracle amcalar diğer database’lerde olan bu özelliği yapmamışlar, bunun nedenini ayrıca inceleriz (bi zahmet öğrenip comment atın bizi uğraştırmayın ehhe). Velhasıl biz de bir manyak olarak “nası olmaz lan olur o” diyerek inat edip bunu yapmak istiyor isek şöyle ilerlememiz gerekiyor,
Dediğim gibi, Oracle’da yazdığımız stored procedure’lerde Mssql Server’daki gibi SELECT kullanarak sonuç kümesi dönemiyoruz.
CREATE OR REPLACE PROCEDURE ORACLE_PROC1 (param OUT VARCHAR2) AS
BEGIN
SELECT * FROM TABLO_ADI;
END;
Bu procedure’u derlemek istediğimizde bize “PLS-00428: an INTO clause is expected in this SELECT statement” hatası dönüyor. (Evet malesef SELECT yapamıyoruz) Dolayısı ile stored procedure’lerden dışarı veri almak istediğiniz zaman OUT parametresi tanımlayıp bu işi yapabiliyorsunuz. Misal;
CREATE OR REPLACE PROCEDURE ORACLE_PROC2 (param OUT VARCHAR2) AS
BEGIN
param := 'hebek';
END;
bu procedure’ü Oracle’da derlediğimiz ve çalıştırdığımızda verdiğimiz parametre değişkenine “hebek” atayacaktır. İşte biz de bu OUT parametre özelliğini ve veritabanlarındaki CURSOR olaylarını kullanarak (CURSOR mevzusu başlı başına bir olay konumuz bu olmadığı için geçiyom hehe) stored procedure içersinden sonuç kümesi çekebiliyoruz. Ahanda örnek stored procedure’ümüz de aşağıda:
CREATE OR REPLACE PROCEDURE ORACLE_PROC3 (my_cursor OUT SYS_REFCURSOR) AS
BEGIN
OPEN my_cursor FOR SELECT * FROM TABLO_ADI;
END;
Buraya kadar olan kısım Oracle ve Oracle’daki stored procedure’ler ile alakalı idi. Şimdi esas konumuza, Java’ya geliyoruz, JDBC ile bu stored procedure’den nasıl yapıcazda ResultSet alıcaz? Ahanda o da kodun önemli kısmı böyle:
Connection conn = null;
OracleCallableStatement stmt = null;
ResultSet rs = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:SID", "myuser", "mypass");
stmt = (OracleCallableStatement) conn.prepareCall("{call ORACLE_PROC3(?)}"); // normal Java'dan procedure çağırma gibi
stmt.registerOutParameter(1, OracleTypes.CURSOR); // out parametre
stmt.execute();
rs = (OracleResultSet) stmt.getCursor(1); // resultset'i alıyoruz
İşte böyle, burdaki kodu inceleyecek olursak, java.sql.Connection nesnesine jdbc üzerinden Oracle’a bir bağlantı yaratıyoruz. Daha sonra java.sql.CallableStatement yerine oracle.jdbc.OracleCallableStatement yaratıyoruz. Ardından registerOutParameter metodu ile OracleTypes.CURSOR tipinde bir parametreyi ekliyoruz ve execute ediyoruz. Execute’den sonra da OracleResultSet’e cast ederek statement’dan cursor bilgisini alıyoruz ve normal ResultSet’de yaptığımız işlemleri yapabiliyoruz.
Full kodu da aşağıda bulabilirsiniz, şimdilik görüşmek üzere cavaaaaaaaaaaaa kalın…
package org.manyaklari.java;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
public class SampleMain
{
public static void main(String args[])
{
Connection conn = null;
CallableStatement stmt = null;
ResultSet rs = null;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:SID", "myuser", "mypass");
stmt = (OracleCallableStatement) conn.prepareCall("{call ORACLE_PROC3(?)}");
stmt.registerOutParameter(1, OracleTypes.CURSOR);
stmt.execute();
rs = (OracleResultSet) stmt.getCursor(1);
while (rs.next())
{
// bıdı bıdı
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
if (rs != null)
{
try {
rs.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
if (stmt != null)
{
try {
stmt.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
if (conn != null)
{
try {
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
}
Bu konuda yardımlarından dolayı H3K3N’ye teşekkür ederim
Social Bookmarking
September 27th, 2007 at 19:54
[…] Java ile Oracle Stored Procedure üzerinden ResultSet almak […]
October 23rd, 2007 at 11:51
Slm,
Stored procedure a resultset gönderme imkanımız varmı..
October 24th, 2007 at 8:06
hmm enteresan bir fikir, denemedim ama stored procedure’ün parametresini cursor tipinde yapıp bir cursor’ü açıp parametre olarak verirsek resultset’i stored procedure’e vermiş oluruz diye düşünüyorum.
January 23rd, 2008 at 14:16
Abi ben sitenize ggl dan ulaştım. Kanser olmak üzre olduğum bi konuydu. Çözüm süper ama Ora-Kıl!