当前位置: 首页 > 知识库问答 >
问题:

Quarkus中的Oracle数据库响应返回一串数字

长孙星汉
2023-03-14

606578838769828362103232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232326065788783698295838465848583627975604765788783698295838465848583621032323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323260657883876982839583698462103232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323260657883876982476210323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232604765788387698283958369846210323232323232323232323232323232323232323232323232323232323232323232323232323232323232323260476578838769828362

起初,我假设每个字符代码是两个数字长。然而,其他回复也包含字符代码超过100的字母。

使用2字符代码的假设,我可以解析上述响应:

<ANSWERS>
                                                <ANWSER_STATUS>OK</ANWSER_STATUS>
                                                <ANSWERS_SET>
                                                    <ANSWER/>
                                                </ANSWERS_SET>
                                            </ANSWERS>
quarkus.datasource.db-kind=oracle
quarkus.datasource.username=${DB_USERNAME:username}
quarkus.datasource.password=${DB_PASSWORD:password}
quarkus.datasource.jdbc.url=jdbc:oracle:thin:@//${DB_HOST:dbhost}:${DB_PORT:1521}/${DB_NAME:dbname}
@Singleton
public class DatabaseCommunicator {

    @Inject
    AgroalDataSource dataSource;

    private static final String QUERY = "{ ? = call abc.SOME_WORDS.STORED_PROCEDURE_NAME(?) }";
    
    public Object getDetails(String objectId) {
        String resultString;

        try (Connection connection = dataSource.getConnection(); CallableStatement statement = connection.prepareCall(QUERY)) {
            String queryBody = "<objectId>" + objectId + "</objectId>";

            statement.setString(2, queryBody);
            statement.registerOutParameter(1, Types.CLOB);

            statement.execute();

            Clob resultClob = statement.getClob(1);
            resultString = readClob(resultClob); // Value of this String is the long number string.
        } catch (SQLException | IOException ex) {
            throw new DatabaseException("Exception while communicating with database", ex);
        }

        return resultString;
    }

    private String readClob(Clob input) throws IOException, SQLException {
        InputStream stream = input.getAsciiStream();

        StringBuilder buffer = new StringBuilder();
        int character = stream.read();

        while (character != -1) {
            buffer.append(character);
            character = stream.read();
        }

        return buffer.toString();
    }
}
[...]
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-agroal</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-jdbc-oracle</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.database.nls</groupId>
      <artifactId>orai18n</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle.database.jdbc</groupId>
      <artifactId>ojdbc11</artifactId>
    </dependency>
[...]

共有1个答案

周峻
2023-03-14

我希望JDBC驱动程序能够自动解码来自数据库的响应。然而,事实证明这并没有发生。

相反,我在JDBC驱动程序中找到了相关代码,帮助我自己解码它。为此,我使用了作为Quarkus BOM一部分的quarkus-jdbc-oracle依赖项:

    <dependency>
      <groupId>com.oracle.database.jdbc</groupId>
      <artifactId>ojdbc11</artifactId>
    </dependency>

然后,我使用驱动程序中已经存在的内置解码逻辑将数字字符串转换为我可以使用的内容:

import static oracle.sql.CharacterSet.WE8ISO8859P15_CHARSET;

import oracle.sql.converter.CharacterConverterFactoryJDBC;
import oracle.sql.converter.JdbcCharacterConverters;


class Example {
    private String readClob(Clob input) throws IOException, SQLException {
        InputStream stream = input.getAsciiStream();

        CharacterConverterFactoryJDBC converter = new CharacterConverterFactoryJDBC();
        JdbcCharacterConverters converters = converter.make(WE8ISO8859P15_CHARSET);

        byte[] bytes = stream.readAllBytes();
        return converters.toUnicodeString(bytes, 0, bytes.length);
    }
}
 类似资料:
  • 问题内容: 在我的科目表中,我按学期和月份列出了所有学生的课程,每个月的分数 这就是我尝试过的 我从查询中获得的当前输出是每个查询的多个响应,因为我可以将其更改为,但不会获取其他数据 我的问题是我如何将它们合并为一个响应,并在预期的输出中返回以下数据(我在每个字段中添加了一些说明以对其进行解释) 预期产量 问题答案: 问题是,您想获取主题,而不是学生。因此,我反转了FROM和LEFT JOIN。因

  • 我想返回作为我的的响应。下面是代码: 我收到错误消息: 无法写入内容:未找到类com.couchbase.client.java.query.defaultn1qlqueryrow的序列化程序,也未找到创建BeanSerializer的属性(为避免异常,禁用SerializationFeature.fail_on_empty_beans)(通过引用链:java.util.ArrayList[0])

  • 问题内容: 在Oracle 10g中,我有以下SQL: 返回: 我想扩展此查询以确定此结果集中的dog.id的oracle rownum。 我试过了 但这并不能很好地解决(无论我匹配哪个dog.id,它都返回1)。我原本希望回来3。 谢谢你的帮助! 笔记 http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html 我很确

  • 问题内容: 就像一个人在这里问到但他的解决方案是调用其他函数 …我想知道是否有可能拥有一个不调用a的函数第二个功能基于异步请求的响应,但仅当异步请求响应时。 可能是这样的: 不调用另一个函数,这有可能吗? 我要实现的目标是拥有一个可以用一些参数调用的函数,该函数将返回异步Web服务(如FB)的响应。 问题答案: 简而言之,没有。您不能让异步函数同步返回有意义的值,因为该值当时不存在(因为它是在后台

  • 在quarkus应用程序中给出的驱动程序名称是什么? 如果它不提供本机支持,那么我们如何修复maven项目中添加的依赖关系? 注:官方网站上没有提到与Oracle有关的内容->https://quarkus.io/guides/datasource#multiple-datasources

  • 我正在尝试编写一个可以返回结果的Java存储过程。我在Oracle网站上找到了这个文档,但是没有一个示例提供返回数据http://docs.oracle.com/cd/B19306_01/java.102/b14187/cheight.htm#CHDJJDGH 我创建了如下软件包: 包体如下 和 Java 代码 我使用SQLDeveloper通过以下指令调用我的过程 执行第二条指令时,我有以下错误