起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 284|回复: 13

【结贴】[问题]关于oracle临时表**

[复制链接]
发表于 2008-11-24 11:04:36 | 显示全部楼层 |阅读模式
不同的用户通过x3平台访问oracle上的同一份临时表,  为什么他们看到的是同样的一份数据? 难道是通过一个会话?
回复

使用道具 举报

发表于 2008-11-24 11:31:51 | 显示全部楼层
你的临时表怎么建立的?
oracle中的临时表建立方式有两种:一种是session级的,一种是事务级的。
回复 支持 反对

使用道具 举报

发表于 2008-11-24 11:46:01 | 显示全部楼层
tomcat有链接池。会话不会释放。
所以你如果用session级的临时表,可能会存在这样的问题。(tomcat中用了连接池,所以不同用户访问的时候可能用同一个会话了,建议你用事务级的)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-24 17:58:49 | 显示全部楼层
PROCEDURE PROC_OA_SET_TASKTREE(USERID IN CHAR,emps out jqf_pak.cur_out) IS
BEGIN
  Delete from TEMP_VIEW_TASKTREE2;
  insert into TEMP_VIEW_TASKTREE2 values ('XM',USERID);
  open emps for select * from VW_OA_TASK_TREE;
   
END;

使用上面的过程取不到数据.

改进如下[建立跟视图一样的表bt_tmp001], 这样可以取道数据:

PROCEDURE PROC_OA_SET_TASKTREE(USERID IN CHAR,emps out jqf_pak.cur_out) IS
BEGIN
  Delete from TEMP_VIEW_TASKTREE2;
  insert into TEMP_VIEW_TASKTREE2 values ('XM',USERID);
  --open emps for select * from VW_OA_TASK_TREE;
  
  insert into bt_tmp001 select * from VW_OA_TASK_TREE;
  
  open emps for select * from bt_tmp001;
  
END;

请问这是什么原因?
回复 支持 反对

使用道具 举报

发表于 2008-11-25 09:07:22 | 显示全部楼层
我大概做了一个测试,没有问题,楼主,你看一下。

a.rar

453 Bytes, 下载次数: 69

回复 支持 反对

使用道具 举报

发表于 2008-11-25 10:06:41 | 显示全部楼层
在Oracle中肯定没问题。我有个问题是在X3中无法取到数据. 代码如下;

    lDS := TQuery.Create(nil);
    lDS.ConnectionString:='DATABASEURL=Biz:\ECIS\ECISDB.Database';
    lTransactionHandle :=lDS.Connection.Transaction.Start(False);    //启动事务 Start
    try
      strSQL:='insert into x3_materialcfg_chg_log_tmp  '
             +'   (m_id, m_sub_id, is_auto, signal_qty) '
             +' select                      '
             +'   b.material_id,            '
             +'   b.sub_material_id,        '
             +'   0,                        '
             +'   nvl(sub_material_qty,0)   '
             +' from  x3_materialcfg_chg_log a    ';
            
      lDS.Close ;
      lDS.CommandText :=strSQL;
      lDS.Execute ;
      lDs.Close ;
      //注:确认了 插入了数据的。


      
      lDS.Close ;
      lDS.CommandText :='select * from x3_materialcfg_chg_log_tmp';
      lDS.Open ;
      jsDialogs.ShowMsg(SysUtils.IntToStr(lDS.RecordCount),'');
      //这里 数据行为零      

      lDS.Connection.Transaction.Commit(lTransactionHandle);   //  提交事务
    except
      lDS.Connection.Transaction.Rollback(lTransactionHandle);  //回滚事务
      raise;
    end;

    jsDialogs.ShowMsg(SysUtils.IntToStr(lDS.RecordCount),'');
    //这里 数据行为零      
   finally
    lDS.Free;
   end;
回复 支持 反对

使用道具 举报

发表于 2008-11-25 11:08:46 | 显示全部楼层
回6楼,如果启动的是非立即事务,那么不能访问到数据;用立即事务就可以访问到。
由于你的临时表是事务 级的,那么当事务提交的后,临时表的数据就自动清空了,这是oracle所决定的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-25 11:39:26 | 显示全部楼层
我那个问题如何. 我用事物临时表测试没有数据.
回复 支持 反对

使用道具 举报

发表于 2008-11-25 13:01:06 | 显示全部楼层
to:金工
我做了一个简单的测试,存储过程以及平台中的调用。
//存储过程调用
{//调用事务级的临时表
Create or Replace package pkg_test
  as
     type ref_cursor is ref cursor;
end pkg_test;
/
Create or Replace procedure proc_tmptmp(tmpdata out pkg_test.ref_cursor)
    is
    BEGIN
      Delete from tmp_aa ;
      insert into tmp_aa(tmpa,tmpb) values('1','1');
      open tmpdata for select * from tmp_aa;
    END proc_tmptmp;
/
----------------------------------------------------
//平台中的存储过程数据集属性设置
object DataSetCCGCSJJ2: TStoredProcDataSet
  Relation.DeleteRule = krNoAction
  Relation.UpdateRule = krNoAction
  ID = 'CCGCSJJ2'
  DisplayName = #23384#20648#36807#31243#25968#25454#38598'2'
  Database.Reference = 'Biz:\CSLZ\ORACLEKJ\OracleSJK.Database'
  CheckConstraints = <>
  Params = <
    item
      DataType = ftCursor
      Name = 'TMPDATA'
      ParamType = ptOutput
    end>
  StoredProcName = 'PROC_TMPTMP'
  Left = 352
  Top = 120
end
}
procedure TMainForm.Button4Click(Sender: TObject);
var
  lTransactionHandle : TTransactionHandle;
begin
  //一定要开一个立即事务,否则不行。
  lTransactionHandle := TStoredProcDataSet(DataSetCCGCSJJ2).Connection.Transaction.Start(True);
  try
      TStoredProcDataSet(DataSetCCGCSJJ2).Close;

    DataSource2.DataSet := DataSetCCGCSJJ2;
    TStoredProcDataSet(DataSetCCGCSJJ2).Open;

    Dialogs.ShowMessage('打开数据集');
    TStoredProcDataSet(DataSetCCGCSJJ2).Connection.Transaction.Commit(lTransactionHandle);
    Dialogs.ShowMessage('事务提交成功');
  except
    TStoredProcDataSet(DataSetCCGCSJJ2).Connection.Transaction.Rollback(lTransactionHandle);
  end;

  TStoredProcDataSet(DataSetCCGCSJJ2).Refresh;
  //这里会报一个对象不存在的错误,那说明这个就是事务级的临时表,因为oracle自动就清掉他了。
end;
回复 支持 反对

使用道具 举报

发表于 2008-11-25 13:03:25 | 显示全部楼层
如果用立即事务(我没有测试)。应该是一个SQL执行语句是一个事务。那第一个SQL语句插入数据,第二个去取,拿到取得到数据吗? 如果不行。我这样情况。我要获得数据,如何处理?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-27 18:13 , Processed in 0.043632 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表