oracle 临时表有关问题

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中有提交和回滚,你选择回滚后再重新调试下看看。