java—在jdbc中使用命名oracle绑定变量的问题

9gm1akwq  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(349)

我正在尝试使用jdbc调用oracle中的sql查询,该查询使用带有:varname语法的绑定变量。该查询是为交互式使用而编写的,如下所示:

select * from foo where bar = :mybar;

如果可以的话,我只需将查询更改为使用jdbc标准“?”符号来表示变量,并使用setstring(1,“x”)来设置它们。不幸的是,我无法更改查询的文本,因为它已被验证可用于医疗应用程序。
我尝试用其他代码来 Package 它,这些代码设置:mybar的值的方式与交互式用户大致相同,下面是oracle的示例,但是我得到了jdbc错误:
java.sql.sqlexception:索引::1处缺少in或out参数。
Package 版本生成如下所示的字符串

variable mybar VARCHAR

begin

:mybar := 'x'

select * from foo where bar = :mybar;

end

oracle驱动程序是通过以下方式加载的v12驱动程序:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1.0</version>
</dependency>

这是我的java代码:

try(Connection conn = getConnection()) {
    PreparedStatement stmt = stmt(conn, study, start, end);
    ResultSet resultSet = stmt.executeQuery();
    return Table.read().db(resultSet);
}

...

private PreparedStatement stmt(Connection connection, String study, LocalDate start, LocalDate end) throws SQLException {
    String query = wrapValidatedQuery(study, start, end);
    return connection.prepareStatement(query);
}

wrapvalidatedquery()方法返回如上所示的查询。
这(下面)是一个独立的版本,应该可以通过对db参数的更改来执行。

public static void main(String[] args) throws Exception {
    String username = "name";
    String password = "pwd";
    Connection conn = null;
    Statement stmt;
    int port = 1521;
    String hostname = "host";
    String dbName = "db_name";
    String jdbcUrl = "jdbc:oracle:thin:@" + hostname + ":" + port + "/" + dbName;

    try {
        String driver = "oracle.jdbc.driver.OracleDriver";
        Class.forName(driver).newInstance();
        conn =  DriverManager.getConnection(jdbcUrl, username, password);
        stmt = conn.createStatement();

        String query =
                "    VARIABLE mybar VARCHAR;\n" +
                        "    begin;\n" +
                        "    :mybar := 'x'; \n" +
                        "    select * from foo where bar = :mybar;\n" +
                        "    end;";
        ResultSet rs = stmt.executeQuery(query);
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        if (conn != null) {
            conn.close();
        }
    }
    throw new RuntimeException("Didn't get results.");
}

有没有一个解决方案可以在不改变查询的情况下工作?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题