Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Piotr Sieniawski - 21-12-2005 12:22 Oracle, nested table, jdbc.
Witam.
Mam w Oracle'u PLSQLowa funkcje, ktora zwraca nested table i chce te dane wyciagnac poprzez JDBC do java'y.
Wyglada to tak (typy i funkcja to prosty przyklad wziety skads tam):
create or replace type address as object ( street varchar2(60), city varchar2(30), state char(2), zip_code char(5) );
create or replace type address_list as table of address;
create or replace function get_address_list return address_list is v_table address_list:=address_list(); i binary_integer; begin v_table.extend(5); for i in 1..5 loop v_table(i):=address('x','y','z',to_char(i)); end loop; return v_table; end get_address_list;
Teraz mam dwa kawalki Java'ovego kodu (jeden dziala a drugi nie bardzo) Najpierw dzialajacy:
To cos elegancko zwraca co nastepuje: x,y,z ,1 x,y,z ,2 x,y,z ,3 x,y,z ,4 x,y,z ,5
A teraz drugi, ktory sie opiera i nie do konca chce dzialac (prawdopodobnie z winy Oracle'a)
cstmt = conn.prepareCall("{ ? = call get_address_list() }"); cstmt.registerOutParameter(1, Types.ARRAY, "ADDRESS_LIST"); cstmt.execute(); array = (Array) cstmt.getObject(1); rs = array.getResultSet(); while (rs.next()) { // Get the object that is in the address_list ( SQL TYPE "ADDRESS" ) // 1st column is the row index // 2nd column is the actual object Struct obj = (Struct) rs.getObject(2); // Get the column attributes for the object Object[] attrs = obj.getAttributes(); // get each of the object columns // It is the programmers responsibility to know specifically // what these types are. In this case they are all strings. String s1 = (String) attrs[0]; String s2 = (String) attrs[1]; String s3 = (String) attrs[2]; String s4 = (String) attrs[3]; System.out.println(s1 + "," + s2 + "," + s3 + "," + s4); }
Jak zamiast tych znakow zapytania otrzymac to co zwraca funkcja PLSQL? Niestety nie moge skorzystac z pierwszej wersji, poniewaz docelowa funkcja bedzie modyfikowac dane w bazie, wiec wsadzenie jej do selecta odpada. Jakies pomysly? Doswiadczenia?
Jesli idzie o samego Oracle'a to oto pare informacji na jego temat Oracle9i Release 9.2.0.6.0 - 64bit Production PL/SQL Release 9.2.0.6.0 - Production CORE 9.2.0.6.0 Production TNS for Solaris: Version 9.2.0.6.0 - Production NLSRTL Version 9.2.0.6.0 - Production
Adamzrk - 21-12-2005 12:22
Jakiego strownika JDBC używasz? Ja miałem problemy z tym do oracle 9i. Może zmiana sterownika na ten z oracle 10g pomoże. Moż coś tutaj znajdziesz: http://www.cs.umb.edu/cs634/ora9idoc...a96654/toc.htm jesli jeszcze tam nie zaglądałeś.
Pozdrawiam
Użytkownik "Piotr Sieniawski" <fake@fake.com> napisał w wiadomości news:1135004075.624789@kwintesencja.lan.mareon.com .pl... > Witam. > > Mam w Oracle'u PLSQLowa funkcje, ktora zwraca nested table i chce te dane > wyciagnac poprzez JDBC do java'y. > > Wyglada to tak (typy i funkcja to prosty przyklad wziety skads tam): > > create or replace type address as object ( > street varchar2(60), > city varchar2(30), > state char(2), > zip_code char(5) ); > > create or replace type address_list as table of address; > > create or replace function get_address_list > return address_list is > v_table address_list:=address_list(); > i binary_integer; > begin > v_table.extend(5); > for i in 1..5 loop > v_table(i):=address('x','y','z',to_char(i)); > end loop; > return v_table; > end get_address_list; > > > Teraz mam dwa kawalki Java'ovego kodu (jeden dziala a drugi nie bardzo) > Najpierw dzialajacy: > > Statement stmnt = conn.createStatement(); > rs = stmnt.executeQuery("select * from table(get_address_list)"); > while (rs.next()){ > String s1 = rs.getString(1); > String s2 = rs.getString(2); > String s3 = rs.getString(3); > String s4 = rs.getString(4); > System.out.println(s1 + "," + s2 + "," + s3 + "," + s4); > } > > To cos elegancko zwraca co nastepuje: > x,y,z ,1 > x,y,z ,2 > x,y,z ,3 > x,y,z ,4 > x,y,z ,5 > > > A teraz drugi, ktory sie opiera i nie do konca chce dzialac > (prawdopodobnie z winy Oracle'a) > > cstmt = conn.prepareCall("{ ? = call get_address_list() }"); > cstmt.registerOutParameter(1, Types.ARRAY, "ADDRESS_LIST"); > cstmt.execute(); > array = (Array) cstmt.getObject(1); > rs = array.getResultSet(); > while (rs.next()) { > // Get the object that is in the address_list ( SQL TYPE "ADDRESS" ) > // 1st column is the row index > // 2nd column is the actual object > Struct obj = (Struct) rs.getObject(2); > // Get the column attributes for the object > Object[] attrs = obj.getAttributes(); > // get each of the object columns > // It is the programmers responsibility to know specifically > // what these types are. In this case they are all strings. > String s1 = (String) attrs[0]; > String s2 = (String) attrs[1]; > String s3 = (String) attrs[2]; > String s4 = (String) attrs[3]; > System.out.println(s1 + "," + s2 + "," + s3 + "," + s4); > } > > Teraz dostaje piekna kolekcje znakow zapytania.: > ???,???,???,??? > ???,???,???,??? > ???,???,???,??? > ???,???,???,??? > ???,???,???,??? > > Jak zamiast tych znakow zapytania otrzymac to co zwraca funkcja PLSQL? > Niestety nie moge skorzystac z pierwszej wersji, poniewaz docelowa funkcja > bedzie modyfikowac dane w bazie, wiec wsadzenie jej do selecta odpada. > Jakies pomysly? Doswiadczenia? > > Jesli idzie o samego Oracle'a to oto pare informacji na jego temat > Oracle9i Release 9.2.0.6.0 - 64bit Production > PL/SQL Release 9.2.0.6.0 - Production > CORE 9.2.0.6.0 Production > TNS for Solaris: Version 9.2.0.6.0 - Production > NLSRTL Version 9.2.0.6.0 - Production >
Piotr Sieniawski - 21-12-2005 12:22
Adamzrk wrote: > Jakiego strownika JDBC używasz? > Ja miałem problemy z tym do oracle 9i. Może zmiana sterownika na ten z > oracle 10g pomoże. Sterownik mam do 10g. Lipa jakas.
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona