всем привет! тему решил разместить здесь т.к. использую специфичный драйвер(oracle.jdbc), если не прав перенесите. БД: | Код | Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production PL/SQL Release 9.2.0.8.0 - Production CORE 9.2.0.8.0 Production TNS for 32-bit Windows: Version 9.2.0.8.0 - Production NLSRTL Version 9.2.0.8.0 - Production
|
jdbc: | Код | Manifest-Version: 1.0 Specification-Title: Oracle JDBC driver classes for use with JDK14 Sealed: true Created-By: 1.4.2_08 (Sun Microsystems Inc.) Implementation-Title: ojdbc14.jar Specification-Vendor: Oracle Corporation Specification-Version: Oracle JDBC Driver version - "10.2.0.3.0" Implementation-Version: Oracle JDBC Driver version - "10.2.0.3.0" Implementation-Vendor: Oracle Corporation Implementation-Time: Fri Sep 29 09:43:24 2006
Name: oracle/sql/converter/ Sealed: false
Name: oracle/sql/ Sealed: false
Name: oracle/sql/converter_xcharset/ Sealed: false
|
create object: | Код | create or replace type test_obj as object ( a_name varchar2(100), a_qnt number, a_date date )
|
create proc: | Код | create or replace package test_pkg is procedure get_obj(p1 out test_obj);
end test_pkg;
create or replace package body test_pkg is
procedure get_obj(p1 out test_obj) as begin p1 := test_obj('name', 888, sysdate); end; end test_pkg;
|
get object at java side: | Код | package javaapplication1;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSetMetaData; import java.sql.SQLException; import oracle.jdbc.OracleCallableStatement; import oracle.sql.STRUCT; import oracle.sql.StructDescriptor;
public class Main { private static void exec() throws SQLException { DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); String connStr = "jdbc:oracle:thin:XXX/XXX@HOST:1521:SID"; Connection conn = DriverManager.getConnection(connStr); String sqlBlock = "begin test_pkg.get_obj(p1 => ?); end;"; OracleCallableStatement stmt = (OracleCallableStatement)conn.prepareCall(sqlBlock);
// register oracle object StructDescriptor structDesc = StructDescriptor.createDescriptor("TEST_OBJ", conn); ResultSetMetaData md = structDesc.getMetaData (); int numAttrs = structDesc.getLength(); String attr_name; int attr_type; String attr_typeName; for (int i = 0; i < numAttrs; i ++) { attr_name = md.getColumnName(i + 1); attr_type = md.getColumnType(i + 1); attr_typeName = md.getColumnTypeName(i + 1); System.out.println ("name="+attr_name+"; type="+attr_type + "; type_name=" + attr_typeName + ";"); } // stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.STRUCT, "TEST_OBJ"); stmt.execute();
STRUCT struct = stmt.getSTRUCT(1); Object[] obj = struct.getAttributes(); for (int i = 0; i < numAttrs; i ++) System.out.println("object_value " + (i) + "=" + obj[i] + "; java_type=" + obj[i].getClass().getName() + ";"); }
public static void main(String[] args) throws SQLException { exec(); } }
|
output: | Код | run: name=A_NAME; type=12; type_name=VARCHAR; name=A_QNT; type=2; type_name=NUMBER; name=A_DATE; type=91; type_name=DATE; object_value 0=???; java_type=java.lang.String; object_value 1=888; java_type=java.math.BigDecimal; object_value 2=2009-05-13 18:07:45.0; java_type=java.sql.Timestamp; BUILD SUCCESSFUL (total time: 1 second)
|
вопрос: почему при получении агрибута с типом varchar2 он "херится" -> "object_value 0=???". если кто то наступал на эти грабли то ткните пожалуйста пальцем где перемудрил. заранее благодарю!!! Это сообщение отредактировал(а) DimW - 20.5.2009, 08:48
|