从 JDBC 执行 Sybase 过程时,出现以下错误:
执行游标是在包含非 SELECT 或带有 COMPUTE 子句的 SELECT 的过程上声明的。为了使这个游标的声明合法,它应该有一个没有计算子句的选择语句
我正在使用 JCONN4 sybase jar。sybase 是否对程序有这样的限制,没有带有计算子句的选择语句?
我也在 Sybase 文档中搜索过,但没有得到正确的答案。
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.39996_1250/html/svrtsg/svrtsg348.htm
我不能在这里发布程序,但我可以发布示例
create proc sample (@value_date datetime = null) as
begin
if @value_date is null
select @value_date = some_column from some_table
select a,b,c,d into #ad
from
table_a where a='something'
select a,b,c,d case when a=0 then 0 else b/a
from #ad
end
Run Code Online (Sandbox Code Playgroud)
使用 sybStatemt.executeQuery 函数调用上述过程
看起来像它的 Sybase 错误。重现问题的步骤
如上所述,创建一个使用计算子句进行选择的过程
编写jdbc程序并使用belew方法 statement.setFetchSize(1000);
执行程序,你会看到错误
现在的问题是 Sybase 真的有这些限制,还是只针对他们的驱动程序,我们可以说它的驱动程序问题?
我使用ApacheMetaModel
到Extract
从数据Sybase ASE 15.5
的数据库,Windows 7的计算机上安装.我是在多线程环境中将数据提取到CSV中.我使用这些开源库
<dependency>
<groupId>com.sybase</groupId>
<artifactId>jconn4</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>com.sybase</groupId>
<artifactId>DDLGen</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>com.sybase</groupId>
<artifactId>dsparser</artifactId>
<version>4.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我在尝试执行SELECT查询时收到错误.它不会为任何特定查询抛出异常.它可以为任何表抛出异常.我正在尝试使用创建查询Apache Meta-model
DataContext
.
Query query = dataContext.query().from(table).as("ct").selectAll().toQuery();
dataContext.executeQuery(query).iterator();
Run Code Online (Sandbox Code Playgroud)
上面的代码将创建如下查询:
SELECT ct."Column1", ct."Column2", ct."Column3", ct."Column4", ct."Column5", ct."Column6", ct."Column7", ct."Column8", ct."Column9", ct."id" FROM schemaowner."tablename" ct
Run Code Online (Sandbox Code Playgroud)
以下是堆栈跟踪:
! com.sybase.jdbc4.jdbc.SybSQLException: There is already another cursor with the name 'jconnect_implicit_134' at the nesting level '0'.
!
! at com.sybase.jdbc4.tds.Tds.processEed(Tds.java:4117) ~[jconn4-4.0.jar:JDK 1.6/jdbcmain/Thu Apr 30 04:18:00 PDT 2015]
! at …
Run Code Online (Sandbox Code Playgroud) 我很疯狂Sybase JDBC驱动程序如何使用mixed IN
和OUT
parameters 处理存储过程.看看这个简单的存储过程:
CREATE OR REPLACE PROCEDURE p (IN i1 INT, OUT o1 INT, IN i2 INT, OUT o2 INT)
BEGIN
set o1 = i1;
set o2 = i2;
END
Run Code Online (Sandbox Code Playgroud)
以下是我用JDBC调用它的方法:
CallableStatement c = connection.prepareCall("{ call dba.p(?, ?, ?, ?) }");
c.setInt(1, 1);
c.setInt(3, 2);
c.registerOutParameter(2, Types.INTEGER);
c.registerOutParameter(4, Types.INTEGER);
c.execute();
System.out.println(c.getObject(2));
System.out.println(c.getObject(4));
Run Code Online (Sandbox Code Playgroud)
但这导致了
1
null
Run Code Online (Sandbox Code Playgroud)
这是怎么回事??这是JDBC驱动程序中的一个非常邪恶的错误还是我完全错过了什么?通过反复试验,我发现这是一种工作方式:
c.setInt(1, 1);
c.setInt(2, 2);
c.registerOutParameter(3, Types.INTEGER);
c.registerOutParameter(4, Types.INTEGER);
c.execute();
System.out.println(c.getObject(3));
System.out.println(c.getObject(4));
Run Code Online (Sandbox Code Playgroud)
现在的结果是
1
2
Run Code Online (Sandbox Code Playgroud)
JDBC驱动程序是否秘密重新排序IN
和OUT
参数?
我正在使用SQL …
我有一个 Java 应用程序,它使用 JTA(Apache Geronimo)来管理事务。使用的数据库是 MySQL。应用程序有很多开始和提交方法。但是,查看 MySQL 常规日志时,我找不到单个“开始事务”查询/命令。该日志已满的SET autocommit=1
,并SET autocommit=0
有commit
和rollback
。因此,查看日志我无法确定事务开始的时间。我不是 Java 人,我也找不到任何有关此的帮助资源。
jConn3 是我唯一能找到的。
'com.sybase.jdbc3.jdbc:jconn3:6.05'
jconnect ×5
java ×4
jdbc ×3
sybase ×2
cursor ×1
jta ×1
maven ×1
mysql ×1
sqlanywhere ×1
sybase-ase ×1