Oracle Apex页面基于加载数据后进入一个或其刷新

时间:2016-11-13 16:16:11

标签: sql oracle oracle-apex

晚上好!

此时我正在Oracle Apex应用程序的页面上工作,该应用程序按以下方式工作。这是一个页面,其中包含某种大而复杂的报表,其中的数据由一个功能区分(让它命名为 feature A )。在页面的左侧有一个“目录菜单”,由此用户可以看到回复功能A 的数据,在右侧显示数据,上面有搜索栏,可以帮助用户通过其他功能找到一些确切的数据功能B 功能C 等。

我有一个视图(让它命名为 V_REPORT_BIG_DATA )来显示报告,但太大而且加载速度很慢 ,我决定用与 V_REPORT_BIG_DATA 相同的字段切换表格上的页面(让它命名为 T_REPORT_BIG_DATA_TEMP )。此外,它还有一个用于进程标识符的附加字段(让它命名为 PID )并且不是物理上的临时性,而是其目的。我认为它必须以这种方式工作:用户进入页面,接收与会话相关的自己的 PID (如果 PID 为空,则有效,否则不会改变),然后程序( P_REPORT_BIG_DATA_RELOAD )删除“旧”数据并上传“新”数据,除了这些操作使用一个 PID 执行并关注明确(例如,当前)用户。

但我的想法看起来似乎不正确。过程 P_REPORT_BIG_DATA_RELOAD 本身工作正常并从Process页面执行, PID 是一个全局Application Item(它是从数据库序列生成的)。但是当我看到我的表有一个用户和一个 PID 的数据重复时,我的大脑几乎被炸毁了!通过在 P_REPORT_BIG_DATA_RELOAD 的代码中创建日志表(已经填充了事实,删除了多少行并再次插入),我看到了非常奇怪的事情:一些用户“加载”了重复项好像上传程序已经多次同时执行了!

考虑到我之前所说的一切,我有以下问题:我做错了什么?我该怎么做,以便我不必在表 T_REPORT_BIG_DATA_TEMP 的查询中使用“distinct”一词?

UPD:我的问题的其他事实。请原谅我的疏忽,因为我认为那里我无法编辑我的第一篇文章。 : - /

好吧,我会进一步解释我的问题。 :)首先,我为我的视图 P_REPORT_BIG_DATA_RELOAD 做了最好的工作,以期望它的加载速度更快,但它涉及许多行。其次,从Process Page执行的代码(例如,在加载我的页面期间)是这样的:

begin
  if :PID is null then
    :PID := NEW_PID;
  end if;
  P_REPORT_BIG_DATA_RELOAD(AUTH => :SUSER, PID => :PID);
end;

NEW_PID 是一个生成新 PID 的函数, P_REPORT_BIG_DATA_RELOAD 是我的程序,它根据用户及其PID刷新数据。< / p>

我的程序代码如下:

procedure P_REPORT_BIG_DATA_RELOAD
  (AUTH in varchar2, PID in number)
is
  NCOUNT_DELETED number;
  NCOUNT_INSERTED number;
begin
  --first of all I check that both parameters are not null - let me omit this part
  --I find the count of data to be deleted (for debug only)
  select count(*)
    into NCOUNT_DELETED
    from T_REPORT_BIG_DATA_TEMP T
   where T.AUTHID = AUTH
     and T.PID = P_REPORT_BIG_DATA_RELOAD.PID;
  --I delete "old" data
  delete from T_REPORT_BIG_DATA_TEMP T
  where T.AUTHID = AUTH
    and T.PID = P_REPORT_BIG_DATA_RELOAD.PID;
  --I upload "new" one
  insert into T_REPORT_BIG_DATA_TEMP
    select V.*, PID from 
     (select S.* from V_REPORT_BIG_DATA S
       where S.AUTHID = AUTH); 
  --I find the count of uploaded data (for debug only)
  NCOUNT_INSERTED := SQL%ROWCOUNT;
  --I write the logs (for debug only)
  insert into T_REPORT_BIG_DATA_TEMP_LG(AUTHID,PID,INS_CNT,DLD_CNT,WHEN)
  values(AUTH,PID,NCOUNT_INSERTED,NCOUNT_DELETED,sysdate);
end P_REPORT_BIG_DATA_RELOAD;

还有一个事实:我试图将 PID 转换为Page Item,但是每次刷新后它都会清除,尽管选项维护会话状态每个会话,所以我甚至不希望在确定的会话中每个确定的用户使用相同的PID。

0 个答案:

没有答案