oracle函数的一种应用

pz 2011-10-06 09:14:42
用一个oracle函数处理多个表的数据,最后将结果放入一个表中,用一个游标返回,然后在JAVA里面直接读取数据,这样可行不?
个人遇到难点:第一,用什么中间数据存储结果表,然后使一个游标指向它?
第二,JAVA处理游标的结果不太熟
求高手指教一哈哈
...全文
162 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyu871225 2011-10-10
  • 打赏
  • 举报
回复
看来还是得多学基础啊!
pz 2011-10-09
  • 打赏
  • 举报
回复
我是先学得基础,看完了精通PL/SQL 10g编程和SQL宝典,大学数据库学的不错,以前有过一段oracle的使用经验
renfengjun 2011-10-09
  • 打赏
  • 举报
回复
多看看基础吧,从实践开始向理论推这种方法不可取。
jwd001 2011-10-08
  • 打赏
  • 举报
回复
create ci as object( 不用%type );
create type ci_list as table of ci;
CREATE PROCEDURE myobj_list_test(recs in ci_list, outs out ci_list) IS
list ci_list := ci_list();
begin
....
end;
pz 2011-10-08
  • 打赏
  • 举报
回复
create type ci is record
{
empno emp.empno% TYPE;
ename emp.ename% TYPE;
job emp.job% TYPE;
mgr emp.mgr% TYPE;
hiredate emp.hiredate% TYPE;
sal emp.sal% TYPE;
comm emp.comm% TYPE;
deptno emp.deptno% TYPE;
}
create type tt is table of ci;
commit;
declare
type tttt is table of ci;
ttt tttt;
t tt;
i int;
begin
select * BULK COLLECT into ttt from emp;
i:=ttt.first;
while ttt.exists(i) loop
dbms_output.put_line('查找出来的学号empno为:'||ttt(i).empno);
i:=ttt.next(i);
end LOOP;
end;
/

我想用oracle的记录表来存储中间结果,但是创建的记录以及记录表在PL/SQL块中无法引用,这让我没法声明函数的返回类型,是不是在PL/SQL里面引用人工创建的object时候要作适当的声明????编译错误如下
错误报告:
ORA-06550: 第 2 行, 第 23 列:
PLS-00905: 对象 SCOTT.CI 无效
ORA-06550: 第 2 行, 第 1 列:
PL/SQL: Item ignored
ORA-06550: 第 4 行, 第 3 列:
PLS-00905: 对象 SCOTT.TT 无效
ORA-06550: 第 4 行, 第 3 列:
PL/SQL: Item ignored
ORA-06550: 第 7 行, 第 28 列:
PLS-00382: 表达式类型错误
ORA-06550: 第 7 行, 第 32 列:
PL/SQL: ORA-00947: 没有足够的值
ORA-06550: 第 7 行, 第 1 列:
PL/SQL: SQL Statement ignored
ORA-06550: 第 10 行, 第 55 列:
PLS-00487: 对变量 'CI' 的引用无效
ORA-06550: 第 10 行, 第 1 列:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

select * from user_types里面可以查到tt,ci对象

pz 2011-10-08
  • 打赏
  • 举报
回复
这是一种比较好的方法,以前一直纠结与临时表的用处呢!
renfengjun 2011-10-06
  • 打赏
  • 举报
回复
使用事务级临时表存储需要返回的数据,java什么的不用说了吧就和普通结果集一样使用。注意要设置autocommit为false,不然临时表里面的数据就被清空了。
renfengjun 2011-10-06
  • 打赏
  • 举报
回复
临时表:
create global temporary table QBTB_XT_HS
(
C_SYS_TYPE VARCHAR2(30)
)on commit delete rows;
renfengjun 2011-10-06
  • 打赏
  • 举报
回复
java:
Connection con=new OracleConncection().getConnection();
con.setAutoCommit(false);
CallableStatement cs =null;
System.out.println(con==null);
cs = con.prepareCall("{? = call PAC_TEST.FUN_TEST('abc')}");
cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
ResultSet rs=(ResultSet) cs.getObject(1);
while (rs.next()){
System.out.println(rs.getString(1));
}
con.commit();
rs.close();
cs.close();
con.close();


SQL:
function FUN_TEST(ABC VARCHAR2) return CUR_RS IS
CURR CUR_RS;
begin
INSERT INTO QBTB_XT_HS(C_SYS_TYPE) VALUES(ABC);
OPEN CURR FOR SELECT * FROM QBTB_XT_HS;
RETURN CURR;
end FUN_TEST;

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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