[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