车轮再造(1):在APEX上使用Ajax一例:Update Table,旨在突破100
在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. 必需品
3. 代码
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;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |