[Java lista] Java/Oracle interdiszciplinaris kerdes
Molnár Miklós
timortinj at freemail.hu
2008. Feb. 13., Sze, 09:01:35 CET
Hali,
Azt gondolom egy valódi, szép, ám nehéz (ha trivi, legfeljebb égek egy
sort... ;) kérdés/probléma, amihez - számomra legalábbis úgy tűnik - mindkét
vonalhoz kell érteni valamelyest, ami felmerült az indexes Oracle-topicban
->
http://forum.index.hu/Article/showArticle?t=1001339, 2857-es hozzászólástól
kezdve.
Úgy tűnik a Java/JDBC nyújt egy olyan szolgáltatást, amit a gyári Oracle a
saját gyári Pro*C/C++-ban _nem_, nevezetesen Oracle referenciális kurzoros
adatátadásnál el tudja valahogy kapni a mezőleíró tömböt (pl.: select * from
emp esetén is).
Az Oracle ref cursor, egy nagyon szimpatikus erőforrás-kímélő, és
használható módszer, egyetlen - igaz nagy - hátránya, hogy
Oracle-instance-ok között nem müxik. Ahogy én tudom ez egy _pointer_ egy
semleges memóriaterületre ahová byte-onként rakódnak ki a rekordok adatai.
Hogy hol vannak a mezőhatárok azt vagy az Oracle-nél kell megadni (akkor nem
jó a ref cursor), vagy a kliensben kell típust definiálni a
memória-területre. Gondoltam én eddig. (Az persze trivi, hogy az Oracle-n
saját magán belül szintén nyújt mezőleíró tömbös szolgáltatást, csúnya
lenne, ha nem így lenne)
A JDBC-nél meg van a ResutlSetMetaData, aminek okosságai:
. How many columns are in a result set (ResultSet object)?
. What is the name of a given column?
. What is the name of a table for a given column?
. Are the column names case sensitive?
. What is the data type of a specific column?
. What is the maximum character size of a column?
. Can you search on a given column?
. Is a given column readable/writable?
Van könyv is a témáról:
JDBC Metadata, MySQL, and Oracle Recipes: A Problem-Solution Approach
http://www.apress.com/book/view/978159059637
JDBC Recipes: A Problem-Solution Approach
http://www.apress.com/book/view/1590595203
A legfontosabb, hogy van itt egy szép gazdaságos mintakód is:
http://www.oradev.com/ref_cursor.jsp
Selecting the ref_cursor from JDBC
To get the cursor from Java you can use the following JDBC-code:
public void method() throws SQLException{
Connection conn = getConnection();
CallableStatement cstmt = null;
ResultSet rs = null;
int deptno = 10;
Object temp;
try{
cstmt = conn.prepareCall("begin test(?,?); end;");
cstmt.setInt(1, deptno);
cstmt.registerOutParameter(2, OracleTypes.CURSOR);
cstmt.execute();
rs = (ResultSet) cstmt.getObject(2);
ResultSetMetaData rsm = rs.getMetaData();
int columnCount = rsm.getColumnCount();
while (rs.next()){
for (int j=0;j< columnCount;j++){
temp = rs.getObject(j+1);
}
}
} finally {
if (!rs==null){
rs.close();
}
if (!stmt==null){
stmt.close();
}
if (!conn==null){
conn.close();
}
}
}
A kérdés tehát, hogy hogyan tud működni a getMetaData metódus, honnan-jövő
és milyen infók alapján. Mi használódik ki, mennyire szabványosan. Azt
értem, hogy az Oracle (is) hegesztett valamit JDBC-szabvány implementálása
érdekében, na de miképp!?
Én annyit próbáltam tenni az ügy érdekében, hogy próbáltam visszafejteni a
kódot az Oracle 11gr1-ben található 3MB-os jdbc6_g.zip alapján, DJ/Jad
decompiler+frontenddel. De végeredményre sajnos nem sikerült jutnom: sajnos
meghaladta a lehetőségeimet a dolog időigénye és/vagy határt szabnak
személyes korlátaim. ;)
Én az OracleCallableStatement.java getobject metódusánál érzem a kutyát
elhantolva, ott már mintha kell léteznie a mezőleíró tömb megszerzéséhez
szükséges infónak (talán épp a refcursur regiszterelésével megtámogatottan),
amiből aztán tud dolgozni OracleResultSetMetaData.java getMetaData metódusa.
De nem lennék meglepve, ha rosszul látnám a kérdést... ;)
Mindenesetre maga az alap-feature, azt gondolom igen szép teljesítmény...
:o) Akárki akármit mond, legyen akármennyi nyűgje, én _szeretem_ a
JDBC-szabványt. ;)
MM
__________ Information from ESET Smart Security, version of virus signature
database 2870 (20080212) __________
The message was checked by ESET Smart Security.
http://www.eset.com
További információk a(z) Javalist levelezőlistáról