表结构如下:
create table APPLICATION
(
  PROINSTID  VARCHAR2(255) not null,
  APPCONTENT VARCHAR2(4000) not null,
  ATTACHMENT VARCHARARRAY
)
nested table ATTACHMENT store as COL_APPLICATION_ATTACHMENT
----------------------------------------------------------------------------------
VARCHARARRAY 是自定义嵌套表类型,结构如下:
create or replace type varchararray as table of varchar(200)
----------------------------------------------------------------------------------
插数据没问题,用pl/sql和jdbc都能插入,问题是查数据该怎么办呢?
且不说jdbc,连在pl/sql下面都不知道怎么查。
我的终极目标是在 jdbc下面查询
ResultSet rs = conn.createStatement().executeQuery("select proinstid,appcontent,attachment from application");
while(rs.next())
{
   ResultSet rsi = rs.getArray("attachment").getResultSet();
   while(rsi.next())
   {
System.out.print(rsi.getString(1) + ",");
   }
   System.out.println("");
}
这样子写法没问题,但输出结果:
1,1,2,1,2,1,
--------------------------------------------------------------------------------------
这个结果显然是不正确的,不知道1,2是什么东西,正确(理想)的输出应该如下:
procexp.chm,
JScript 语言参考.chw,java精通swing程序设计.chm
无忧网络下载说明-msmir.net.txt,procexp.exe
ojdbc5.jar
--------------------------------------------------------------------------------------
虽然结果不对,但输出结构的个数是对应的。
如果把内循环改成:
   while(rsi.next())
   {
System.out.print(rsi.getString(2) + ",");
   }
也就是取第二个字段,
输出结果如下:
???,???,???,???,???,???,
貌似是乱码,我无法确定,试图用iso-8859-1、utf-8之类的也转不出来。
哪位高手能指导一下? 给些新思路也行。感激不尽。
注:主要为了探寻知识,不想绕过去。我这里没有用存储过程来取数据。

解决方案 »

  1.   

    select proinstid,appcontent,b.column_value from application a,table(a.attachment) b
      

  2.   

    多谢一楼的sql语句,这样确实能查出数据,但不是我的初衷。
    我想在jdbc里,从ResultSet 中再取个ResultSet这种方式把数据拿出来(所谓嵌套嘛),有办法吗?
      

  3.   

    我觉得我上面那条sql是比较简单的方法,通过a的主键或rowid可知解压出来的多行数据是否是同一行。
    如果你坚持一定要取出数组,那可能先用ArrayDescriptor.createDescriptor创建一个对象,然后绑定对象到列,然后再把该对象转为数组,总之写出来的代码相当冗长并且难懂。
      

  4.   

    好哥们,终于把这点东西判出来了,ArrayDescriptor.createDescriptor
    我也能得到这个对象,可我里面的方法貌似没有什么取数据的,能否帮我写详细点?
    研究了一下午,每个结果不死心啊
    ----------------------------------------------------------
    oracle.sql.ARRAY arr = (ARRAY)rs.getObject("attachment");
    ArrayDescriptor ad = arr.getDescriptor();
      

  5.   

    对了,这是实体,一看便知,我实在不想添加实体里面的最后一个方法,无奈啊,如果用你之前说的那个方法,就得group by 然后再拆分字符串,感觉这样不安全。
    public class Application 
    {
    private String proinstid;
    private String appcontent;
    private String[] attachment;

    public String getProinstid() {
    return proinstid;
    }
    public void setProinstid(String proinstid) {
    this.proinstid = proinstid;
    }
    public String getAppcontent() {
    return appcontent;
    }
    public void setAppcontent(String appcontent) {
    this.appcontent = appcontent;
    }
    public String[] getAttachment() {
    return attachment;
    }
    public void setAttachment(String[] attachment) {
    this.attachment = attachment;
    }
    public void setAttachment(String attachment) {
    this.attachment = attachment.split(",");
    }
    }
      

  6.   

    你可以参考http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/oraarr.htm
    的"16.4.2.6 Retrieving Array Elements into an oracle.sql.Datum Array"
      

  7.   

    这位仁兄,我已经知道问题的根源了,一开始的写法本来就没问题,那些问号确实是乱码,我用嵌套表或者varray只要是number类型都没问题,都能取出数据,只要是varchar2类型就不行,不管里面的数据是中文还是数字或英文,结果都是??? 
    三个问号显然也不是真正能代替字符的乱码,内容再长都是三个问号,所以转肯定也是装不出来的。你有什么好的建议吗?
      

  8.   

    问题已解决。缺少一个jar文件。多谢。