Java ile Oracle Stored Procedure üzerinden ResultSet almak

oracle, java July 19th, 2007

Jasfid

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
Add to: Mr. Wong Add to: Digg Add to: Del.icio.us Add to: Reddit Add to: StumbleUpon Add to: Slashdot Add to: Netscape Add to: Furl Add to: Yahoo Add to: Google Add to: Technorati Add to: Newsvine Add to: Ma.Gnolia



Başka Manyak Konular


Lütfen Yorumlarınızı bizimle paylaşın.

4 Responses to “Java ile Oracle Stored Procedure üzerinden ResultSet almak”

  1. Java ile Oracle Stored Procedure üzerinden ResultSet almak | sql.manyaklari.org Says:

    […] Java ile Oracle Stored Procedure üzerinden ResultSet almak […]

  2. onur Says:

    Slm,
    Stored procedure a resultset gönderme imkanımız varmı..

  3. jasfid Says:

    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.

  4. hatosh Says:

    Abi ben sitenize ggl dan ulaştım. Kanser olmak üzre olduğum bi konuydu. Çözüm süper ama Ora-Kıl!

Leave a Reply

Site Navigation

Categories

Archives

Meta

Recent Enteries

Recent Comments

FireStats iconPowered by FireStats