
正文
java代码游标解决 java mysql游标
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求JAVA ORACLE服务器游标实现分页的完整实例
1、首先建立一个包java代码游标解决,用户创建一个游标类型create or replace package pkg_query as
type cur_query is ref cursor;
end pkg_query;2、创建存储过程CREATE OR REPLACE PROCEDURE prc_query
(p_tableName in varchar2, --表名
p_strWhere in varchar2, --查询条件
p_orderColumn in varchar2, --排序java代码游标解决的列
p_orderStyle in varchar2, --排序方式
p_curPage in out Number, --当前页
p_pageSize in out Number, --每页显示记录条数
p_totalRecords out Number, --总记录数
p_totalPages out Number, --总页数
v_cur out pkg_query.cur_query) --返回java代码游标解决的结果集
IS
v_sql VARCHAR2(1000) := ''; --sql语句
v_startRecord Number(4); --开始显示的记录条数
v_endRecord Number(4); --结束显示的记录条数
BEGIN
--记录中总记录条数
v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' WHERE 1=1';
IF p_strWhere IS NOT NULL or p_strWhere '' THEN
v_sql := v_sql || p_strWhere;
END IF;
EXECUTE IMMEDIATE v_sql INTO p_totalRecords;
--验证页面记录大小
IF p_pageSize 0 THEN
p_pageSize := 0;
END IF;
--根据页大小计算总页数
IF MOD(p_totalRecords,p_pageSize) = 0 THEN
p_totalPages := p_totalRecords / p_pageSize;
ELSE
p_totalPages := p_totalRecords / p_pageSize + 1;
END IF;
--验证页号
IF p_curPage 1 THEN
p_curPage := 1;
END IF;
IF p_curPage p_totalPages THEN
p_curPage := p_totalPages;
END IF;
--实现分页查询
v_startRecord := (p_curPage - 1) * p_pageSize + 1;
v_endRecord := p_curPage * p_pageSize;
v_sql := 'SELECT * FROM (SELECT A.*, rownum r FROM ' ||
'(SELECT * FROM ' || p_tableName;
IF p_strWhere IS NOT NULL or p_strWhere '' THEN
v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
END IF;
IF p_orderColumn IS NOT NULL or p_orderColumn '' THEN
v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
END IF;
v_sql := v_sql || ') A WHERE rownum = ' || v_endRecord || ') B WHERE r = '
|| v_startRecord;
DBMS_OUTPUT.put_line(v_sql);
OPEN v_cur FOR v_sql;
END prc_query;3、JAVA代码里取出结果集String sql= "{ call prc_query(?,?,?,?,?,?,?,?,?) }";
CallableStatement call = con.prepareCall(sql);// ……中间数据设置及注册省略call.registerOutParameter(9, OracleTypes.CURSOR);// 取出结果集(ResultSet) call.getObject(9);
相关问答
Q1: 急!求JAVA程序中超出游标最大数的解决方法!
java代码游标解决你这个代码是存在问题的java代码游标解决,rs5频繁的被重新赋值,而使用完毕后没有及时关闭,只在最后关闭一次。
ResultSet rs2=null;
ResultSet rs5=null;
try{
rs2=Conn.ExecuteQuery(sql);
while(rs2.next()){
for(k=0;kmyfiledname.length-i;k++){
String datapath1=rs2.getString(myfiledname[k]);
}
for(int m=k;mmyfiledname.length;m++){
//这里r5重复赋值,造成了游标的重复打开
rs5=Conn1.ExecuteQuery(sql2);
rs5.last();
}
//不知道java代码游标解决你这个起什么作用,是不是逻辑上有问题?
if(rs5.getRow()!=0){
rs5.first();
datapath3=rs5.getString("content");
}
}
}catch(SQLException eer){
eer.printStackTrace();
}
finally{
try
{
rs2.close();
rs5.close();
Conn.CloseStmt();
Conn.CloseConn();
}
catch(Exception e)
{}
}
由于不知道你的意图,只能尝试性修改,看看是否满足你的要求,如果有什么问题可以单独联系。
ResultSet rs2=null;
ResultSet rs5=null;
try{
rs2=Conn.ExecuteQuery(sql);
while(rs2.next()){
for(k=0;kmyfiledname.length-i;k++){
String datapath1=rs2.getString(myfiledname[k]);
}
for(int m=k;mmyfiledname.length;m++){
rs5=Conn1.ExecuteQuery(sql2);
if(rs5.getRow()!=0){
rs5.first();
datapath3=rs5.getString("content");
}
Conn1.CloseStmt();
rs5.close();
rs5 = null;
}
}
}catch(SQLException eer){
eer.printStackTrace();
}
finally{
try
{
rs2.close();
if (rs5 != null) {
rs5.close();
Conn1.CloseStmt();
}
Conn.CloseStmt();
Conn.CloseConn();
Conn1.CloseConn();
}
catch(Exception e)
{}
}
Q2: java调用存储过程返回游标的结果集无法关闭游标的问题
在过程里判断很简单呀
CREATE OR REPLACE PROCEDURE TESTPROC(CUR OUT SYS_REFCURSOR)
AS
default_c SYS_REFCURSOR;
BEGIN
OPEN CUR FOR SELECT * FROM AA;
if CUR%rowcount = 0 then
CUR:=default_c;
end if;
END;
定义一个默认空游标,没数据就返回它呗
Q3: java中怎样使用游标
java中没有,但可以用Types.OTHER来代替
另外如果用的是Oracle数据库,则很方便的用OracleTypes.CURSOR来获取游标 (需要class12.jar驱动程序)
Q4: 在java中调用oracle过程,游标无效
rs_cursor out 是返回java代码游标解决的游标java代码游标解决,但是一般都不这么用,而且游标都要关闭,
如果你想返回List 或结果集的话,不般都不用游标来返回记录集的,除非自定义oracle 或sqlserver的数据库 集合类型.
如果你是用java ,肯定用到 ibatis,hibernate 等数据中间件来查询返回结果,
例如ibatis的简单查询:
public ListOrder getOrdersNotInPackage(String tId) {
return this.getSqlMapClientTemplate().queryForList("getOrdersNotInPackage", tId);
}
调用xml 中配置的sql 来查询getOrdersNotInPackage 的sql ,输入参数是tId 。
Q5: 超出打开游标的最大数,该如何处理?
处理超出打开游标的最大数异常:\x0d\x0a在执行如下代码时,经常会出现ora-01000: maximum open cursors exceeded异常\x0d\x0afor(int i=0;i show parameter open_cursors;\x0d\x0aNAME TYPE VALUE\x0d\x0a------------------------------------ ----------- ---------------\x0d\x0aopen_cursors integer 1000\x0d\x0a\x0d\x0a重要的是将 OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值), 也不会增加系统开销。\x0d\x0a2. 获取打开的游标数。\x0d\x0a下面的查询按降序显示用户“SCOTT”为每个会话打开的游标数。\x0d\x0aSQL select o.sid, osuser, machine, count(*) num_curs\x0d\x0a2 from v$open_cursor o, v$session s\x0d\x0a3 where user_name = 'SCOTT' and o.sid=s.sid\x0d\x0a4 group by o.sid, osuser, machine\x0d\x0a5 order by num_curs desc;\x0d\x0aSID OSUSER MACHINE NUM_CURS\x0d\x0a-----------------------------------------------------\x0d\x0a217 m1 1000\x0d\x0a96 m2 10\x0d\x0a411 m3 10\x0d\x0a50 test 9\x0d\x0a请注重,v$open_cursor 可以跟踪会话中 PARSED 和 NOT CLOSED 的动态游标(使用 dbms_sql.open_cursor() 打开的游标)。它不会跟踪未经分析(但已打开)的动态游标。在应用程序中使用动态游标并不常见。本模式的前提是未使用动态游标。\x0d\x0a3. 获取为游标执行的 SQL。\x0d\x0a使用在以上查询结果中找到的 SID 运行下面的查询:\x0d\x0aSQL select q.sql_text\x0d\x0a2 from v$open_cursor o, v$sql q\x0d\x0a3 where q.hash_value=o.hash_value and o.sid = 217;\x0d\x0aSQL_TEXT\x0d\x0aselect * from empdemo where empid='212'\x0d\x0aselect * from empdemo where empid='321'\x0d\x0aselect * from empdemo where empid='947'\x0d\x0aselect * from empdemo where empid='527'\x0d\x0a...\x0d\x0a结果将显示正在连接上执行的查询。它提供了一个入手点,让您可以反向跟踪到打开游标的来源。\x0d\x0a\x0d\x0a这样的错误很轻易出现在java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,假如你的createStatement和prepareStatement是在一个循环里面的话,就会非常轻易出现这个问题。因为游标一直在不停的打开,而且没有关闭。\x0d\x0a一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,假如不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。\x0d\x0a对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。\x0d\x0a而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常非凡的要求。\x0d\x0a假如你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。\x0d\x0a但是假如你使用连接池,那么请注重,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库答应的最大值”的错误,导致程序无法正常访问数据库。\x0d\x0a正确的代码,如下所示:\x0d\x0afor(int i=0;i
回答于 2023-01-06
华为Mate50 Pro曲面旗舰手机
¥6799
苹果 AirPods Pro 2代
¥1699
索尼65英寸4K HDR专业游戏电视
¥7499
惠普战66五代15.6英寸轻薄本
¥4399
查看更多
向TA提问
关于java代码游标解决和java mysql游标的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







