【问题标题】:jdbc doesn't run what SQL Developer runsjdbc 不运行 SQL Developer 运行的内容
【发布时间】:2015-02-17 04:57:53
【问题描述】:

所以我在 Java 应用程序中使用 jdbc 来查询几个不同的数据库。我让用户为每个用户输入他们的凭据。

其中一个数据库运行良好,但对于另一个,我有两个问题。

对于其中一个查询:

select 语句运行良好并从 SQL 开发人员(Oracle 的 SQL IDE)返回一整行 5 项,但是从 Java 应用程序执行时,只有第二列和第三列将数据放入我的变量中,其余的是空字符串。这是 SELECT 语句:

SELECT CD_DIST, CD_RQMT, TS_OPER_LAST_UPDTD, ID_OPER_LAST_UPDTD, ST_RQMT
    FROM TWMMILESTONERQMT
    WHERE CD_WR = '219033'
    and CD_RQMT = '555';

这里是 Java 代码:

        String wrNumber = ((Integer)(p.myWRNumber)).toString();
        String selectStatement =
        "SELECT CD_DIST, CD_RQMT, TS_OPER_LAST_UPDTD, ID_OPER_LAST_UPDTD, ST_RQMT " + 
            "FROM TWMMILESTONERQMT " + 
            "WHERE CD_WR = '" + wrNumber + "' " + 
            "and CD_RQMT = '555' ";
        System.out.println(selectStatement);

        PreparedStatement sel1 = stormsConn.prepareStatement(selectStatement);
        ResultSet res = sel1.executeQuery();
        while(res.next())
        {
            String district = res.getString("CD_DIST");
            String requirement = res.getString("CD_RQMT");
            String lastUpdatedTimestamp = res.getString("TS_OPER_LAST_UPDTD");
            String lastUpdatedPerson = res.getString("ID_OPER_LAST_UPDTD");
            String requirementState = res.getString("ST_RQMT");
            if(district != null)
            {
                p.myRequirementDistrict = district;
            }
            if(requirement != null)
            {
                p.myRequirementNumber = requirement;
            }
            if(lastUpdatedTimestamp != null)
            {
                p.myRequirementLastUpdatedTimestamp = lastUpdatedTimestamp;
            }
            if(lastUpdatedPerson != null)
            {
                p.myRequirementLastUpdatedPerson = lastUpdatedPerson;
            }
            if(requirementState != null)
            {
                p.myRequirementState = requirementState;
            }
        }

        res.close();
        sel1.close();

对于另一个查询,它再次在 SQL Developer 中运行良好,但是当我在 Java 应用程序中运行它时抛出了这个异常:

java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist

对于这两个查询,我使用的凭据与我在 SQL 开发人员中使用的凭据相同,否则我会怀疑这是权限问题。几个小时以来,我一直在努力解决这个问题。

更新(已解决):

对于例外情况,我使用了错误的Connection 来运行我的查询,所以我在错误的数据库中查找表。难怪没找到。

至于空白结果列的奥秘,显然Oracle DB中varchar2类型的列不能使用jdbc驱动的.getString(...)函数。相反,必须使用.getAsciiStream(..) 函数,然后可以将InputStream 转换为String真的 糟透了,它没有警告您或无法以这种方式返回该数据类型的任何内容。我认为它应该抛出异常,或者在 jdbc 驱动程序中实现。

感谢大家的帮助!

【问题讨论】:

  • 您确定列数据类型与字符串匹配吗?你总是打电话给res.getString(),但这可能不适用于例如一个约会。此外,您可以尝试使用带有列索引的getXXX() 变体作为参数而不是列名。
  • 我尝试将其更改为使用.getString(int columnIndex),但没有任何变化。由于您的评论,我调查了数据库中的数据类型,有趣的是,似乎其他数据类型的数据类型,例如 DateNumber正在 工作的数据类型, varchar2 类型的那些在我发布的查询中不起作用。我对为什么会发生这种情况感到非常困惑,因为查询似乎毫无例外地执行。
  • 成功!您在数据类型方面走在了正确的轨道上,谢谢。原来varchar2类型必须使用.getAsciiStream(...)函数而不是.getString(...)!那么你会得到一个InputStream,它可以被转换成一个字符串。

标签: java oracle jdbc plsql


【解决方案1】:

如果他们是同一个用户,这些程序是从不同的机器上运行的吗?是否有任何 ip 块? 在java端为没有参数的同一张表编写一个简单的选择查询 “从 TWMMILESTONERQMT 中选择 CD_DIST”看看这是否有效

【讨论】:

  • 我尝试了SELECT CD_DIST from TWMMILESTONERQMT WHERE 1 = 1,这是个好主意,但每一行仍然只是String district 变量中的一个空字符串。一切都在同一个桌面上运行,没有虚拟机或远程连接。
  • 所以这次你没有得到 java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist ?
  • 尝试执行“SELECT CD_DIST from TWMMILESTONERQMT where CD_DIST is not null limit 5”
  • 在 TWMMILESTONERQMT 表上,我从来没有遇到过这个异常,它只是给了我第一列、第四列和第五列的空字符串。针对连接到 TMWWR 的 TWMADDRESS 的不同查询是给出异常的查询。
  • 尝试了not null 声明,不幸的是同样的结果。
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2011-04-28
  • 2019-01-03
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多