Tag: 存储过程

为什么oracle存储过程的执行时间会大大增加,具体取决于它的执行方式?

这是我的问题: 我们有一个名为: HEAVY_SP的存储过程,在所有场景中都使用相同的参数 我们有一个oracle sql开发人员。 这可以称为: IDE 根据执行方式,执行时间会大大增加: (1)直接在查询窗口(IDE )中 CALL HEAVY_SP(0, ‘F’, 5, …) )= 15秒 (我们当前的解决方案) (2)使用IDE = 15秒的特殊按钮 (3)使用dbms_job(预定执行)= 15秒 作业已安排但未执行。 使用IDE执行作业(右键单击并执行) (4)使用dbms_job(即时执行)= 超过01小时,迭代非常慢 (5)从SQL_PLUS(linux)= 超过01小时,迭代很慢 (6)从JAVA = 超过01小时,迭代非常慢 (7)从TOAD = 超过01小时,迭代非常慢 我们吃了很多谷歌页面如下: 为什么此结果一查询,运行速度较慢,在-A-存储过程超在-的查询窗口 甲骨文-PL-SQL过程的运行-慢于SQL Oracle的插入输入-存储过程-非常慢-相比对插入件-运行-手动 存储进程内运行-30-慢通过-java的抗磨合直接上的数据库 所以我的问题是: 为什么Oracle以这种方式行事? 它不应该在所有场景(相同的参数)中表现得快吗? 存储过程必须修改? 如果查询计划,跟踪文件或统计信息显示传送行为,则必须修复存储的prodecure? 为什么在查询窗口中执行速度快? 提前致谢。 [编辑] 遵循@BobJarvis关于统计数据的建议 我们的统计数据是最新的。 甚至,我们重新执行了EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>’SOME_USER’, tabname=>’SOME_TABLE’, cascade => […]

如何使用java读取从存储过程返回的类型的ARRAY?

这是在以下位置发布的问题的延续: 将Bean列表传递给oracle存储过程的Java程序 – 一次性传递整个列表而不是一个接一个地追加对象 我一直在尝试增强上面链接位置中提到的存储过程,并在实现中感到困惑。 而不是VARCHAR2作为过程的输出,我现在想要返回NUM_ARRAY作为过程的输出。 你能帮我实现逻辑来读取我的java代码中的NUM_ARRAY吗? 通常使用Map out = super.execute(inParams)返回输出; 我现在如何将NUM_ARRAY提取到我的bean? The source code implementation is as follows. import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import oracle.jdbc.OracleTypes; import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; import org.apache.log4j.Logger; import org.springframework.jdbc.core.SqlOutParameter; import org.springframework.jdbc.core.SqlParameter; import org.springframework.jdbc.core.SqlTypeValue; import org.springframework.jdbc.object.StoredProcedure; public class RevPrdBrkDwnSP extends StoredProcedure{ private final Logger […]

我可以用hibernate标准调用存储过程吗?

这是我的问题,我必须使用一个大的SP,并且没有时间在java中重写。 所以我正在使用Hibernate标准,我不知道我是否可以调用它。 谢谢大家。

存储过程通过Java运行速度比直接在数据库上运行慢30%

我正在使用Java 1.6,JTDS 1.2.2(也只是尝试1.2.4无效)和SQL Server 2005来创建CallableStatement来运行存储过程(没有参数)。 我看到运行相同存储过程的Java包装器比使用SQL Server Management Studio慢30%。 我运行MS SQL分析器,两个进程之间的I / O差别不大,所以我认为它与查询计划缓存无关。 存储的proc不带参数,也不返回任何数据。 它使用服务器端游标来计算填充表所需的值。 我无法看到从Java调用存储过程如何增加30%的开销,当然它只是数据库的一个管道,SQL被发送下来然后数据库执行它….数据库是否可以提供Java应用不同的查询计划? 我已发布到MSDN论坛和sourceforge JTDS论坛(主题:“在JTDS中存储过程比在DB中更直接”)我想知道是否有人有任何关于为什么会发生这种情况的建议? 提前致谢, -詹姆士 (NB不要害怕,我会在找到解决方案后整理其他论坛中的所有答案) Java代码段: sLogger.info(“Preparing call…”); stmt = mCon.prepareCall(“SP_WB200_POPULATE_TABLE_limited_rows”); sLogger.info(“Call prepared. Executing procedure…”); stmt.executeQuery(); sLogger.info(“Procedure complete.”); 我已经运行了sql profiler,并发现了以下内容: Java app:CPU:466,514阅读次数:142,478,387撰写:284,078期限:983,796 SSMS:CPU:466,973阅读次数:142,440,401写作:280,244持续时间:769,851 (两个DBCC DROPCLEANBUFFERS在分析之前运行,并且都产生正确的行数) 所以我的结论是他们都执行相同的读写操作,只是他们这样做的方式不同,你们怎么想? 事实certificate,不同客户端的查询计划明显不同(Java客户端在插入期间更新索引,而不是在更快的SQL客户端中,执行连接的方式也不同(嵌套循环Vs.收集流,嵌套循环Vs索引扫描,唉!))。 这就是为什么,我还不知道(当我到底时,我会重新发帖) 结语 我无法让它正常工作。 我尝试在Java和Mgmt studio客户端之间对连接属性( arithabort , ansi_nulls等)进行同质化。 它最终导致两个不同的客户端具有非常相似的查询/执行计划(但仍然具有不同的实际plan_ids)。 我发布了我在MSDN SQL Server论坛上发现的内容摘要,因为我发现不仅在JDBC客户端和管理工作室之间,而且在Microsoft自己的命令行客户端SQLCMD之间有不同的性能,我还检查了一些更激进的事情,如网络流量也可以将存储的proc包装在另一个存储过程中,只是为了咧嘴笑。 […]

TO_DATE Oracle DBMS_SQL.EXECUTE函数问题

我试图使用DBMS_SQL.EXECUTE函数调用Oracle存储过程。 我将PL / SQL块作为输入参数传递给函数,该函数使用DBMS_SQL.EXECUTE函数调用DB过程。 该过程有一个字符串参数,我使用TO_DATE函数以字符串格式传递当前日期。 请参阅下面的我用于调用该过程的语法。 调用该过程时,传递的日期将作为DATE数据类型保存在数据库中。 我面临的问题是截断日期的时间部分,时间变为12:00 AM,无论传递给函数的时间如何。 有人可以让我知道我做错了什么吗? 用于调用函数的SQL块: plsql_block =BEGIN P_USER_TIME(to_date(’21-JUL-2012 03:30:30′,’DD-MON-YYYY HH24:MI:SS’)); Return; End; 调用该过程的函数的SQL语法: ret_int := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(ret_int,plsql_block,DBMS_SQL.NATIVE); ret_int_execute := DBMS_SQL.EXECUTE(ln_dbms_cur); PFB是oracle代码块 我正在使用一个函数,它将日期作为varchar输入,并且n将它传递给另一个过程。我可以看到过去与日期相关的时间没有插入到某个场景中。 请在下面找到我的function iv_plsql4 :=’10-08-2012 07:30:30′; ln_dbms_cur := DBMS_SQL.OPEN_CURSOR; iv_plsql2 := BEGIN PKG_PRADEEP.P_INSERTDATE(to_date(iv_plsql4,’DD-MM-YYYY HH24:MI:SS’)); DBMS_OUTPUT.put_line(iv_plsql); DBMS_SQL.PARSE(ln_dbms_cur,iv_plsql,DBMS_SQL.NATIVE); ln_cur_execute := DBMS_SQL.EXECUTE(ln_dbms_cur); This code inserts the date in to the database but […]

如何处理callableStatement.registerOutParameter(1,java.sql.Types.BOOLEAN);

在Oracle 10g / 11g中有一个存储过程,如下所示: CREATE OR REPLACE PROCEDURE SP_SOME_PROC ( PRM_ID IN NUMBER , START_DATE IN DATE, RESULT OUT BOOLEAN) is… 使用以下代码调用它并获得结果: String sql = “{call SP_SOME_PROC(?,?,?) }”; callableStatement = conn.prepareCall(sql); callableStatement.setLong(1, theid); callableStatement.setDate(2, new java.sql.Date(startDate.getTime())); callableStatement.registerOutParameter(3, java.sql.Types.BOOLEAN); callableStatement.executeUpdate(); Boolean result = callableStatement.getBoolean(3); 但是,上面的代码会产生如下例外情况 [10/8/13 2:28:24:736 EEST] 0000009a SystemErr R java.sql.SQLException: Invalid column type: 16 […]

Oracle NCLOB中的特殊字符

我正在处理Oracle 10g数据库,并提供以下存储过程: procedure get_synopsis ( p_id in my_schema.products.p_id%type, p_synopses out sys_refcursor); — cursor of – synopsis_type, synopsis_text 在我的Java代码中,我以这种方式准备语句: String idForDb = fromIdUrlToIdDb(prodIdUrl); statement.registerOutParameter(1, OracleTypes.VARCHAR); statement.setString(1, idForDb ); statement.registerOutParameter(2, OracleTypes.CURSOR); 我以这种方式得到了我需要的数据: String defaultSyn, nonDefSyn; String returnedId = ((OracleCallableStatement)stm).getString(1); try ( ResultSet synopses = ((OracleCallableStatement)stm).getCursor(2) ){ // p_synopses – cursor of: synopsis_type, synopsis_text while( synopses!=null && synopses.next() […]

H2数据库中的存储过程

我是数据库的新手,最近开始编写H2数据库的测试用例。 我想知道如何在Eclipse中测试存储过程。 我见过以下内容: http://www.h2database.com/html/features.html#user_defined_functions 如何在H2中创建程序 h2database链接中给出的示例代码, “CREATE ALIAS NEXT_PRIME AS $$ String nextPrime(String value) { return new BigInteger(value).nextProbablePrime().toString(); } $$; ” 应该在哪里宣布?以及如何运行它? PS – 我有H2 JAR文件并正在测试它。 如果有人可以告诉我如何在Java中为H2编写一个简单的存储过程,那将会有很大的帮助。 在H2中还有以下任何等价物吗? “开始dbms_output”? 谢谢。

没有为存储过程定义参数@x …使用MS_SQL JDBC

我试图在方法中使用SQL Server JDBC执行存储过程: //Connection connection, String sp_name, Mapparams input to the method DatabaseMetaData dbMetaData = connection.getMetaData(); HashMap paramInfo = new HashMap(); if (dbMetaData != null) { ResultSet rs = dbMetaData.getProcedureColumns (null, null, sp_name.toUpperCase(), “%”); while (rs.next()) paramInfo.put(rs.getString(4), rs.getInt(6)); rs.close(); } String call = “{ call ” + sp_name + ” ( “; for (int i […]

使用简单的jdbc调用将数组作为输入参数传递给oracle存储过程

这是我的oracle程序规范 CREATE OR REPLACE PACKAGE PKG_RE_FI AS PROCEDURE PRC_RE_FI_DETAILS(P_FAN_NO IN VARCHAR2, P_REF_ID IN TY_APP_REF_ID, P_COMMENTS IN VARCHAR2, P_BILLING_FLAG IN VARCHAR2, P_STATUS OUT VARCHAR2); END PKG_RE_FI; TY_APP_REF_ID是 CREATE OR REPLACE TYPE ty_app_REF_ID as varray(500) of obj_array_ref_id CREATE OR REPLACE TYPE obj_array_ref_id AS OBJECT( app_ref_id VARCHAR2(100) ) 我使用Spring JDBC Framework(SimpleJdbcCall对象)来执行上述过程。 下面是我声明的代码片段 this.reFIJdbcCall = new SimpleJdbcCall(dataSource).withCatalogName(“PKG_RE_FI”). withProcedureName(“PRC_RE_FI_DETAILS”).declareParameters(new SqlParameter(“P_FAN_NO”, […]