关于调用结果集的问题,在线等待!

pqhass 2003-03-09 11:07:39
创建的存储过程为:
create or replace procedure taskselect(ts_id varchar2)
as
tn varchar(20);
tam number(10,0);
begin
select task_name,amount into tn,tam from tasks where task_id=ts_id;
end;
/
在SQL*PLUS里面调用成功:
SQL> execute taskselecttry('19980001');
PL/SQL 过程已成功完成。
但在java里面为什么总是出错?帮帮忙,好急呀!
下面是我在java里的调用语句:
String procedure = "{?=call taskselect(?)}";
CallableStatement cstmt = conn.prepareCall(procedure);//执行查询
cstmt.setString(1,searchTaskID);
ResultSet rs=cstmt.executeQuery();
while(rs.next()) {
String name=rs.getString(1);
out.println(name);
}

...全文
40 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
pqhass 2003-03-10
  • 打赏
  • 举报
回复
问题解决了,改用了oracle jdbc驱动,
String procedure = "{?=call task_search.taskselect(?,?)}";
象sky2003202说的将这句前面的?=去掉即可
pqhass 2003-03-09
  • 打赏
  • 举报
回复
由于出现的错误为
javax.servlet.ServletException: [Oracle][ODBC][Ora]ORA-24334: ????????
我在想是不是在java中调用游标时出现的问题。因为我看到一般的JDBC Driver是用的oracle.driver,因此在注册输出变量时用的是
cstmt.registerOutParameter(2,OracleTypes.CURSOR);
在返回结果集时用的是
rs=(ResultSet)cstmt.getCursor(2);
而我用的JDBC Driver是jdbc-odbc桥,所以在注册输出变量时用的是
cstmt.registerOutParameter(2,Types.OTHER);
在返回结果集时用的是
rs=(ResultSet)cstmt.getObject(2);
不知道这个地方有没有问题?
pqhass 2003-03-09
  • 打赏
  • 举报
回复
没有问题呀,编译都通过了,你再试试:
SQL> create or replace package task_search
2 as
3 type ta_search is ref cursor;
4 procedure gettask(ta_id varchar2,ts_sor out ta_search);
5 end task_search;
6 /

程序包已创建。

SQL> create or replace package body task_search
2 as
3 procedure gettask(ta_id varchar2,ts_sor out ta_search)
4 is
5 begin
6 open ts_sor for
7 'select task_name,amount from tasks where task_id = :ta_id'
8 using ta_id;
9 end gettask;
10 end task_search;
11 /

程序包主体已创建。
sky2003202 2003-03-09
  • 打赏
  • 举报
回复
你的sp没问题么
你写的应该编译都过不了

看看好像没什么问题,我这没有你的环境
pqhass 2003-03-09
  • 打赏
  • 举报
回复
:-(
试了,还是不行!
我认为其实
open ts_sor for
'select task_name,amount from tasks where task_id = :ta_id';
using ta_id;

open ts_sor for
select task_name,amount from tasks where task_id=ts_id;
都是可以的。
究竟是什么地方出了问题呢?!
sky2003202 2003-03-09
  • 打赏
  • 举报
回复
procedure gettask(ta_id in varchar2,ts_sor out ta_search)
is
begin
open ts_sor for
'select task_name,amount from tasks where task_id = :ta_id'
using ta_id;
end gettask;
end task_search;
pqhass 2003-03-09
  • 打赏
  • 举报
回复
程序包为:
create package task_search
as
type ta_search is ref cursor;
procedure gettask(ta_id varchar2,ts_sor out ta_search);
end task_search;
程序包体为:
create package body task_search
as
procedure gettask(ta_id varchar2,ts_sor out ta_search)
is
begin
open ts_sor for
select task_name,amount from tasks where task_id=ts_id;
end gettask;
end task_search;
在jsp中的调用语句为:
…………
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:datamy","system","pqh0720");
…………
String sqlStr = "{call task_search.gettask(?,?)}";//按你的意思去掉了?=
CallableStatement cstmt = conn.prepareCall(sqlStr);
cstmt.registerOutParameter(2,Types.OTHER);
cstmt.setString(1,searchTaskID);//searchTaskID是从表单中提交的数据
cstmt.executeQuery();
ResultSet rs=null;
rs=(ResultSet)cstmt.getObject(2);
while(rs.next()){
System.out.println(rs.getString(1));
}


sky2003202 2003-03-09
  • 打赏
  • 举报
回复
你把java 和sp 都给我看一下,我在看看
pqhass 2003-03-09
  • 打赏
  • 举报
回复
CallableStatement cstmt = conn.prepareCall(procedure);

cstmt= pConn.prepareCall(sqlStr);
好像没什么不同呀?
我改了试了还是不行,出现的错误和我上面说的一样
sky2003202 2003-03-09
  • 打赏
  • 举报
回复
cstmt= pConn.prepareCall(sqlStr);
pqhass 2003-03-09
  • 打赏
  • 举报
回复
这句?这句有错吗?怎么改?
sky2003202 2003-03-09
  • 打赏
  • 举报
回复
不会吧
我就是这么用的

你看看你是不是别的地方还有错
CallableStatement cstmt = conn.prepareCall(procedure)这句你改了么?
pqhass 2003-03-09
  • 打赏
  • 举报
回复
我刚调试了一下,按你的做法错误更多呀:
javax.servlet.ServletException: [Oracle][ODBC][Ora]ORA-06550: ? 1 ?, ? 7 ?:
PLS-00306: ?? 'taskselect' ??????????
ORA-06550: ? 1 ?, ? 7 ?:
PL/SQL: Statement ignored
我看过资料,好像一般有输出变量的话call前都要用?=的
sky2003202 2003-03-09
  • 打赏
  • 举报
回复
String procedure = "{?=call task_search.taskselect(?,?)}";
->
String strSQL = "{call task_search.taskselect(?,?)}";
pqhass 2003-03-09
  • 打赏
  • 举报
回复
这个我也试过了,我在java中调用的语句为:
…………
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection("jdbc:odbc:datamy","system","pqh0720");
…………

String procedure = "{?=call task_search.taskselect(?,?)}";
CallableStatement cstmt = conn.prepareCall(procedure);
cstmt.registerOutParameter(2,Types.OTHER);
cstmt.setString(1,searchTaskID);
cstmt.execute();
ResultSet rs=(ResultSet)cstmt.getObject(2);
while(rs.next()){
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
}
…………
但是还是错误,错误提示为
javax.servlet.ServletException: [Oracle][ODBC][Ora]ORA-24334: ????????
请问sky2003202,你调试成功了吗?能否帮我调试一下,这个问题困了我一个星期了,急呀!
sky2003202 2003-03-09
  • 打赏
  • 举报
回复
java中定义
ResultSet rstSet = null;
rstSet = (ResultSet) call.getObject(3);

call.getObject(2)为你要返回的结果

CREATE OR REPLACE PACKAGE pkg_test
AS
TYPE myrctype IS REF CURSOR;
END pkg_test;
/
create or replace procedure taskselect(ts_id in varchar2,p_rc out pkg_test.myrctype)
as
str varchar2(50);
begin
str:='select task_name,amount from tasks where task_id='''||ts_id||'''';
open p_rc for str;
end;
/
pqhass 2003-03-09
  • 打赏
  • 举报
回复
急死了,我连英文资料都看了一大堆了,还是找不到错误。有谁有用java调用结果集的成功例子,帮帮忙呀!
beckhambobo 2003-03-09
  • 打赏
  • 举报
回复
那要找相关资料,网上有提供此类方法
pqhass 2003-03-09
  • 打赏
  • 举报
回复
我用你这种方法做过:
SQL> create package task_search
2 as
3 type ta_search is ref cursor;
4 procedure taskselect(ts_id varchar2,ts_sor out ta_search);
5 end task_search;
6 /

程序包已创建。

SQL> create package body task_search
2 as
3 procedure taskselect(ts_id varchar2,ts_sor out ta_search)
4 is
5 begin
6 open ts_sor for
7 select task_name,amount from tasks where task_id=ts_id;
8 end taskselect;
9 end task_search;
10 /

程序包主体已创建。
创建的包和过程都成功,只是在java中调用用游标返回的结果集时出现错误,所以改用最上面的方法,返回的记录不止一条。
主要是请教如何在java中“调用”结果集的问题。

beckhambobo 2003-03-09
  • 打赏
  • 举报
回复
java中还没试过,只像一般调用过程,但在参数out类型要把包名也写进去。
若确定select task_name,amount into tn,tam from tasks where task_id=ts_id;只有一条记录,也可这样。

create or replace procedure taskselect(ts_id in varchar2,tn out varchar2,tam out number)
as
begin
select task_name,amount into tn,tam from tasks where task_id=ts_id;
end;
/
declare
tn varchar(20);
tam number(10,0);
begin
taskselect('19980001',tn,tam);
dbms_output.put_line(tn||' '||tam);
end;
/
加载更多回复(3)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧