加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

车轮再造(1):在APEX上使用Ajax一例:Update Table,旨在突破100

发布时间:2020-12-15 21:03:44 所属栏目:百科 来源:网络整理
导读:在APEX可以通过htmldb_get来实现Ajax功能。 本文试图通过Update Table来解释如何使用htmldb_get。 APEX不是可以通过FORM Page自动保存(Update)数据吗?多余。。。有人会这样说。 其实,有时候就是需要 自行更新 (Update)表。比如说,在一个FORM中APEX允

在APEX可以通过htmldb_get来实现Ajax功能。

本文试图通过Update Table来解释如何使用htmldb_get。

APEX不是可以通过FORM Page自动保存(Update)数据吗?多余。。。有人会这样说。

其实,有时候就是需要自行更新(Update)表。比如说,在一个FORM中APEX允许最多100个Item。

如果你的FORM使用了100个以上的Item,怎么办?

对此,Oracle的专家们争论很多。但结论是,100个Item就够用了。至今(APEX V4.2)还是保留了这个100个Item的限制。

专家们说,没有用户想输入多于60个Item的FORM。确实如此,我就特烦数目繁多的输入页面。

如果多于这个数字,大多可以通过数据结构的再设计来减少Item数。

有兴趣的话,可参看以下URL: https://forums.oracle.com/forums/thread.jspa?threadID=2347626

可是实际上,100个Item确实不够用。我就多次遇到多于100的情形。

原因有二,

其一,有些系统因为历史原因,即使不合理,用户也不愿意改变;即使是新的系统,用户经常会有不合理的要求。

而在用户第一的原则下,很难否定这些不合理的要求。

其二,有些中间结果本来是可以在服务器端让Oracle计算的,但是,用户要求像Excel那样进行动态计算,

如此一来,这些计算从服务器端移到客户端,靠javascript完成,为了避免多重维护或计算的矛盾,只保留javascript上的算法,

这样也使得很多与计算相关的项目(输入和结果双方)被纳入FORM之中,使得Item数目增加。

所以,只好苟且这车轮再造之事。

1. 流程

通过按钮启动javascript->定义 htmldb_get (指定on-demand Procedure, 给 Application Item赋值) -> 执行 htmldb_get -> 返回结果

2. 必需品

  • 在Page上定义一个 javascript, updateTable。负责完成上述流程。
  • 在Application上定义一个Application Item, SQL_STRING。容纳javascript生成的Update语句。

Application: 104 BcCAS
Name :SQL_STRING
Session State Protection: Unrestricted

  • 在Application上定义一个on-demand Procedure, UPDATETABLE。执行所生成的Update语句。

3. 代码

  • on-demand Procedure, UPDATETABLE
declare
sql_str varchar2(3200);
fst_word varchar2(3200);
l_msg varchar2(100):= 'Error: Only INSERT,DELETE,UPDATE,SELECT are allowed.';
user_expt exception;


begin


sql_str := :SQL_STRING;
fst_word:= upper(regexp_substr(sql_str,'[^ ]+',1)); 

if fst_word in ('INSERT','UPDATE','DELETE','SELECT') then
    execute immediate sql_str;
    commit;
    htp.p(fst_word||' Finished.');
else
    RAISE user_expt;
end if;

/** URL for test
f?p=application_id:0:session:APPLICATION_PROCESS=process_name:::item-names:item-values

e.g.
f?p=104:0::APPLICATION_PROCESS=UpdateTable:::TEMP:11223344
**/

EXCEPTION
  WHEN user_expt THEN
    htp.p(l_msg||'  '||sql_str);
  WHEN OTHERS THEN
    HTP.p('Error: '||SQLERRM);

end;


说明: 为了防止破坏性较大的drop,truncate等SQL语句,程序中特别设定了对SQL语句首个词汇的限制,使其只能执行'INSERT','SELECT'操作(14行)。

当然,还不够全面。其实,这个Procedure的最简单版本只要如下即可:

begin
    execute immediate :SQLSTRING;
end;
  • javascript, updateTable
<script language="JavaScript" type="text/javascript">
<!--
function updateTable(){
  var sqlStr = 'Update BC_INIT set INIT_KJ_COST = ' + $x('P91_INIT_KJ_COST').value.replace(/,/g,"");
  sqlStr = sqlStr + ' where BCASE_UKETSUKE_NO =' + $x('P91_UK_NO').value;
  //alert(sqlStr);

  var ajaxReq = new htmldb_Get(null,&APP_ID.,'APPLICATION_PROCESS=UpdateTable',$x('pFlowStepId').value);
  ajaxReq.add('SQL_STRING',sqlStr);
  var ajaxRtn = ajaxReq.get();
  alert(ajaxRtn);
}
//-->
</script>

说明: SQL_STRING(9行)和UpdateTable(8行)分别是在Application层次上定义的Item和On-Demand Procedure.

ajaxRtn(10行)是从UpdateTable返回的message。

成功时会显示“Update Finished。”

出错时会显示相应的错误信息。

此例中,为了方便说明,只对1个Item进行Update(4行)。

大量Item的情况下,这种hard-coding的方式便不可取。对此,将另行讨论。

快过年了,不想写的太详细。仓促贴上全部代码:http://www.52php.cn/article/p-oxmbosfq-rm.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读