我正在尝试使用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.");
}
有没有一个解决方案可以在不改变查询的情况下工作?
暂无答案!
目前还没有任何答案,快来回答吧!