相关疑难解决方法(0)

Oracle OCI,绑定变量和ID IN(1,2,3)之类的查询

简洁版:

我正在寻找以下Java技术的C++ OCI改编,其中代码能够将数组数组(数组大小可以变化)绑定到非PL/SQL SELECT语句中,然后在WHERE ID IN (...)样式检查中使用结果数组.

http://rafudb.blogspot.com/2011/10/variable-inlist.html

原始问题:

我们有一个C++应用程序通过OCI与Oracle通信.我们正在尝试修复通过连接文本生成SQL查询的旧代码; 相反,我们希望尽可能多地使用绑定变量.我们提出了一个特殊的案例,即我们没有一个好的解决方案.

SELECT * FROM MyTable WHERE ID IN (1, 4, 10, 30, 93)
Run Code Online (Sandbox Code Playgroud)

其中(1, 4, 10, 30, 93)一部分来自一个vector<int>或数据的其他一些灵活大小容器.如果我们知道它总是五个值,我们可以这样做:

SELECT * FROM MyTable WHERE ID IN (:1, :2, :3, :4, :5)
Run Code Online (Sandbox Code Playgroud)

但它可能是一个条目,或十个,甚至可能是零.显然,如果我们将查询构建为字符串,我们可以根据需要添加尽可能多的数字,但目标是尽可能避免这种情况并坚持只绑定变量.

有没有一个很好的方法来实现这一目标?例如,在OCI中,我可以绑定一个数组然后从中进行子选择吗?

SELECT * FROM MyTable WHERE ID IN (SELECT * FROM :1)
Run Code Online (Sandbox Code Playgroud)

:1OCI阵列在哪里?(可能语法不同.)有没有人有这方面的经验?示例代码将是天赐之物,因为我倾向于编写原始OCI.谢谢 :)

编辑:我想比在PL/SQL过程解析的字符串中绑定更好,如果可能的话.我相信在很多情况下我们会吹掉4000个字符的限制,而且我觉得这只是交易一种我很舒服的字符串操作,另一种我不是(我不能)调试很容易).如果可能的话,我想将一个值数组(或某种形式的数据集)绑定到一个标准SQL语句中.

编辑2:一些调查发现以下链接似乎正在做我想要的,但在Java:http: //rafudb.blogspot.com/2011/10/variable-inlist.html有谁知道如何适应这个处理C++ OCI?

c++ sql oracle oracle-call-interface bind-variables

11
推荐指数
1
解决办法
7604
查看次数

java.sql.SQLException:ORA-00932:不一致的数据类型:预期NUMBER得到了BINARY

我在Dao类中有一个返回的方法List<Object[]>,我使用的是命名查询

public List<Object[]> getListByCustomer(Session session, int customerId, List<Integer> strIds) {
  Query namedQuery = session.createSQLQuery(QueryConstants.EXPORT);
  namedQuery.setParameter("customer", customerId);
  namedQuery.setParameter("stringId", strIds);
  List<Object[]> objects = namedQuery.list();
  return objects;
}
Run Code Online (Sandbox Code Playgroud)

我想将List<Integer> strIdsstringId 传递给命名查询,如下所示:

public class QueryConstants {
  public static final String EXPORT = 
    "SELECT sv.NAME, sv.TYPE, sv.CLIENT_ADDRESS, sv.NAME_REDUNDANT, sv.DEPARTURE_DATE, s1.CODE,sv.STATE, sv.CODE "
    + "FROM VIEW sv, PROCESS p1, SET s1 " 
    + "WHERE sv.R_ID = p1.R_ID and p1.ISSUER_ID = s1.USER_ID and sv.CUSTOMER_ID = :customer and sv.R_ID IN (:stringId)";
}
Run Code Online (Sandbox Code Playgroud)

但我明白了 ORA-00932: …

java sql oracle named-query

4
推荐指数
3
解决办法
4万
查看次数