使用 ResultSet.getNString 或 getString 在 Java 中获取代码视图。 return 不是来自 DBA_VIEWS.text 的完整字符串

To get the code view in Java with ResultSet.getNString or getString. Does not return the complete string from DBA_VIEWS.text

我正在尝试在 java 中使用结果集获取代码视图 (Oracle)。但是当我使用 getStringgetNString 函数时,我只得到一个 32K 字符的链。 视图的长度大于 100K 个字符。

我使用查询:

SELECT * FROM DBA_VIEWS

请帮忙。

使用延迟访问结果集的 Reader。

try (Reader reader = rs.getNCharacterStream(...)) {
    if (reader == null) {
        return null;
    }
    StringWriter writer = new StringWriter();
    reader.transferTo(writer);
    return writer.toString();
}

try-with-resources 中允许空 reader。


由于 transferTo 自 java 10 以来就存在,这里有一个替代方案。

    char[] buf = new buf[1024];
    for (;;) {
        int nread = reader.read(buf);
        if (nread == -1) {
            break;
        }
        writer.write(buf, 0, nread);
    }

请检查您的数据库和驱动程序版本。

getString适用于长度 > 32K 的 LONG 列

示例

SELECT TEXT_LENGTH  FROM DBA_VIEWS where owner = 'SYS' and VIEW_NAME= 'DBA_STREAMS_COLUMNS';

TEXT_LENGTH
-----------
      36331

这个剪掉了

 def rs = stmt.executeQuery("SELECT TEXT  FROM DBA_VIEWS where owner = 'SYS' and VIEW_NAME= 'DBA_STREAMS_COLUMNS'")

 while(rs.next())
  {
   String txt = rs.getString(1)  
   println "got txt    ${txt.take(10)}...${txt.reverse().take(10).reverse()}, size: ${txt.length()}"
  }

returns

got txt    select dis...     ) = 0, size: 36331

使用过的版本

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
DriverVersion 12.1.0.2.0

我用ResultSet.getBinariToString解决了,这个函数取dba_views.text的所有字符。谢谢大家。

public String getBinaryToString(String columna){
    try {
            java.io.InputStream is = resultados.getBinaryStream(columna);
            int intValueOfChar;
            String targetString = "";
            while ((intValueOfChar = is.read()) != -1) {
                targetString += (char) intValueOfChar;
            }
            is.close();
            return targetString;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(Base.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
}