oracle 临时表问题如题:直接上代码function fun_sys_getparmrole(userid varchar2) return cur_type iscur
oracle 临时表问题
如题:
直接上代码
function fun_sys_getparmrole(userid varchar2) return cur_type is
cur_type_tp cur_type;
counts number:=-1;
ls_userid varchar2(50);
lp_str varchar2(100);
lc_str varchar2(500);
ls_temp1 varchar2(2000);
ls_temp2 varchar2(2000);
ls_temp3 varchar2(2000);
begin
lp_str:='drop table self_temp_back';
execute immediate lp_str;
lc_str:='create global temporary table self_temp_back(fconfigid varchar2(50), fparname varchar2(500), fparvalue varchar2(500)) on commit preserve rows';
execute immediate lc_str;
然后 一系列操作 插入数据
open cur_type_tp for select fconfigid, fparname, fparvalue from self_temp_back;
return(cur_type_tp);
end fun_sys_getparmrole;
ps:第一次执行没有问题
在存储过程里面测试也没有问题
我写的是个包 这里用的函数 当然也替换为存储过程写法测试了
但是点最上面那个执行的时候就报错了
*第 1 行出现错误:
ORA-14452: 试图创建, 更改或删除正在使用的临时表中的索引
===============
网上已经搜索 还是没有解决
在java 里 用jdbc调用 的写法 传参 和 cursor 这些都没问题
此外,表已经赋予 用户操作的任何权限 插入数据一已经成功 执行也没问题
就是删除时,提示 好像是 锁表了
truncate也试过了
------------------
我就是想在java里得到一个 结果集
通过存储过程实现 ,当然是有条件的,不同条件 返回不一样。
(已经通过本地表实现了需求)
之前用临时表做的,想突破这个问题
此外 语句全是动态执行的 因为跨库的
---------------------
期待大牛出现。
[解决办法]不知道你下面这样做的意义在哪里
lp_str:='drop table self_temp_back';
execute immediate lp_str;
lc_str:='create global temporary table self_temp_back(fconfigid varchar2(50), fparname varchar2(500), fparvalue varchar2(500)) on commit preserve rows';
execute immediate lc_str;
直接 建个 临时表不就得了么,还非得要在函数里面建。
[解决办法]问题在于你的使用,临时表的定义有两种,一是commit后,数据自动删除,另一个是会话断开后,数据自动删除,你这明显是后者,第一次执行是没事儿的,因为之前没人用它,当你执行完第一次,往临时表里插入了数据,这时,你的数据还存在,你去删除,当然不可以,还有,即使你的数据删除了,临时表如果有别人在用,也是不可以删除的,你的这种用法就有问题,表怎么可能频繁的在代码里创建删除呢?这么做有什么意义呢?
[解决办法]很明显,有别的会话也在同时用这个临时表。有其它地方在用,当然不能删除。
oracle临时表需要指定名称和类似,这和sqlserver不太一样。
[解决办法]会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。
[解决办法]感觉像是那里出现幼稚问题,调试的时候你已经返回数据了,也就是你的临时表在用,这个时候在PLSQL/Developer中有提交和回滚,你选择回滚后再重新调试下看看。