Tag: oracle

不能在JDBC PreparedStatement中使用LIKE查询?

查询代码和查询: ps = conn.prepareStatement(“select instance_id, ? from eam_measurement where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where resource_group_id = ?) and DSN like ‘?’ order by 2″); ps.setString(1,”SUBSTR(DSN,27,16)”); ps.setInt(2,defaultWasGroup); ps.setString(3,”%Module=jvmRuntimeModule:freeMemory%”); rs = ps.executeQuery(); while (rs.next()) { bla blah blah blah … 返回一个空ResultSet 。 通过基本的调试我发现它的第三个绑定是问题,即 DSN like ‘?’ 我尝试了各种各样的变化,其中最明智的似乎是使用: DSN like concat(‘%’,?,’%’) 但这不起作用,因为我错过了连接字符串两侧的’所以我尝试: DSN like ‘ concat(‘%’,Module=P_STAG_JDBC01:poolSize,’%’) […]

java – 在oracle存储过程中传递数组

我有一个Java应用程序访问oracle存储过程。 存储过程的参数包括数组类型。 我喜欢以下…… con = this._getConnection(); Connection narrowdConn = (Connection)WSJdbcUtil.getNativeConnection( (WSJdbcConnection)con ); callable = con.prepareCall(“{call MY_PKG.MY_PROCEDURE(?, ?)}”); ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor(“VARCHAR2_ARR”, narrowdConn); ARRAY arrayArg1 = new ARRAY(arrayDescriptor, con, docNames); ARRAY arrayArg2 = new ARRAY(arrayDescriptor, con, docTypes); callable.setArray(1, arrayArg1); callable.setArray(2, arrayArg2); callable.execute(); 现在,我得到了这个例外…… java.sql.SQLException: invalid name pattern: MY_PKG.VARCHAR2_ARR VARCHAR2_ARR是一个公共TYPE,在Oracle Package中定义,如下所示: TYPE VARCHAR2_ARR是VARCHAR2的表(50); 并在我的存储过程中使用… PROCEDURE MY_PROCEDURE (V_ARR_ARG1 […]

MyBatis批量插入/更新Oracle

我最近开始学习使用myBatis。我现在面临这样的情况,我需要不断通过WebService获取一个新的Objects列表,然后对于这个列表,我需要通过oracle DB表插入/更新每个对象MyBatis的。 棘手的部分是,我不能简单地每次都进行批量插入,因为某些对象可能已经存在于DB中,对于这些记录,我需要更新它们的字段而不是新的插入。 我当前的解决方案可能非常愚蠢,使用Java,从webservice构建Object列表,循环遍历每个,执行myBatis选择,如果它不是null(已经存在于db中),则执行myBatis更新; 否则,为这个新对象执行myBatis插入。 function实现。 但我的技术负责人表示它效率非常低,因为使用Java进行for循环并逐个插入/更新将消耗大量系统资源。 他建议我通过传递一个对象列表来使用myBatis进行批量插入。 然而,myBatis中的批量插入很简单,因为我不是纯粹插入(对于我需要更新的现有记录),我不认为批量插入在这里是合适的。 我已经google了一段时间,并意识到我可能需要使用“merge”而不是“insert”(对于Oracle)。 我在myBatis中搜索合并的示例仅适用于一个对象,而不是批处理。 因此,我想知道专家是否可以提供一些关于如何在MyBatis中进行批量合并的例子(编写Mapper的正确方法)?

日期的hibernate标准

在oracle我有格式的日期 2011年4月17日19:20:23.707000000 我想检索17-04-2011的所有订单。 SimpleDateFormat formatter = new SimpleDateFormat(“dd-MM-YYYY”); String myDate = “17-04-2011”; Date date = formatter.parse(myDate); Criteria criteria = session.createCriteria(Order.class); Criterion restrictDate = Restrictions.like(“orderDate”,date); 但它给我带来空洞的结果:

Java JDBC – 如何使用tnsnames.ora连接到Oracle

tnsnames.ora文件包含Databases及其描述( host + port )。 是否可以依赖上述文件建立连接? (假设仅提供数据库名称): 为了找到这个文件,我必须知道默认的oracle home我需要在Windows注册表中检查HKEY_LOCAL_MACHINE\Software\Oracle ,然后获取所有KEY_XXX文件,然后检查哪一个首先出现在%PATH% 。 有没有办法在客户端计算机上自动查找此文件?

如何以可靠的方式编写/更新Oracle blob?

我正在尝试在blob列中编写和更新pdf文档,但我只能更新blob,只写入比以前存储的数据更多的数据。 如果我尝试用较小的文档数据更新blob列,我只会得到一个损坏的pdf。 首先使用empty_blob()函数初始化blob列。 我在下面编写了示例Java类来测试此行为。 我第一次使用’true’作为main方法的第一个参数运行它,所以在第一行中存储了大约31kB的文档,在第二行中存储了一个278kB的文档。 然后我用’false’作为参数运行它,这样两行应该更新交换文件。 结果是,只有当我写入比现有数据更多的数据时,才能得到正确的结果。 如何编写一种以可靠的方式编写和更新blob的方法而不必担心二进制数据的大小? import static org.apache.commons.io.IOUtils.copy; import java.io.FileInputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import oracle.jdbc.OracleDriver; import oracle.jdbc.OracleResultSet; import oracle.sql.BLOB; import org.apache.commons.lang.ArrayUtils; /** * Prerequisites: * 1) a table named ‘x’ must exists [create table x (i number, j blob);] * 2) that table […]

获取exceptionORA-00942:表或视图不存在 – 插入现有表时

在尝试将一批行插入现有表时,我遇到exception ORA-00942:表或视图不存在 我可以确认该表存在于db中,我可以使用oracle sql developer将数据插入该表。 但是当我尝试在java中使用preparedstatement插入行时,其抛出表不存在错误。 请在下面找到错误的堆栈跟踪 java.sql.SQLException: ORA-00942: table or view does not exist at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1889) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093) at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047) at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout>>(OracleStatement.java:2709) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589) at quotecopy.DbConnection.insertIntoDestinationDb(DbConnection.java:591) at quotecopy.QuoteCopier.main(QuoteCopier.java:72) 任何人都可以提出这个错误的原因吗? 更新:问题已解决 我的数据库连接属性或我的表或视图名称没有问题。 问题的解决方案非常奇怪。 我尝试插入的其中一列是Clob类型。 因为我之前在oracle db中处理clob数据时遇到了很多麻烦,尝试用一个临时字符串setter替换clob setter并执行相同的代码,没有任何问题,所有行都被正确插入!!! 即。 peparedstatement.setClob(columnIndex,clob) 被替换为 peparedstatement.setString(columnIndex,“String”) 为什么错误表或视图确实存在错误导致插入clob数据时出错。 你能解释一下吗? 非常感谢您的回答和评论。

如何使用返回参数从Hibernate调用Oracle函数?

我的问题非常类似于通过Hibernate获取PL / SQL函数的返回值 我有一个函数在内部进行一些修改,它返回一个值。 最初的想法是做这样的事情: protected Integer checkXXX(Long id, Long transId) throws Exception { final String sql = “SELECT MYSCHEMA.MYFUNC(” + id + “, ” + transId + “) FROM DUAL”; final BigDecimal nr = (BigDecimal) this.getHibernateTemplate() .getSessionFactory().getCurrentSession().createSQLQuery(sql) .uniqueResult(); return nr.intValue(); } 不幸的是,这不适用于Oracle。 做这样的事情的推荐方法是什么? 有没有办法从我的语句中提取声明的变量?

如何使用Hibernate(EntityManager)或JPA 2调用Oracle函数或过程

我有一个返回sys-refcursor的Oracle函数,当我使用Hibernate 4调用此函数时,我收到以下exception。 Hibernate: { ? = call my_function(?) } org.hibernate.exception.GenericJDBCException: could not execute query javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute query at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1360) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1288) at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:313) 我该如何解决这个问题? Oraclefunction create or replace FUNCTION my_function(p_val IN varchar2) RETURN SYS_REFCURSOR AS my_cursor SYS_REFCURSOR; BEGIN OPEN my_cursor FOR SELECT emp_name FROM employees WHERE lower(emp_name) like lower(p_val||’%’); RETURN my_cursor; END; […]

将数组传递给oracle程序

我想从java发送两个数组到oracle存储过程。 第一个数组是字符串数组,第二个是字符数组,我怎么能这样?