在 Oracle APEX v4.2.2 中通过 Ajax 调用 Oracle 函数以进行现场验证
Posted
技术标签:
【中文标题】在 Oracle APEX v4.2.2 中通过 Ajax 调用 Oracle 函数以进行现场验证【英文标题】:Calling an Oracle function via Ajax for on-the-spot validation purposes in Oracle APEX v4.2.2 【发布时间】:2014-02-23 19:22:33 【问题描述】:我正在使用带有 Oracle Apex v4.2.2 的 Oracle 11g,我想知道如何在动态操作中通过 ajax 调用调用 Oracle 函数的最佳方式。
我基本上有一个函数,它接受六个参数,返回“无效”或“有效”的结果。
在我的页面中,我希望能够接受用户输入的值,一旦他们按下按钮进行处理,我需要通过 ajax 检查结果是“无效”还是“有效”并立即呈现用户通过对话框通知他们出现错误。
在 Oracle APEX v4.2.2 中是否有处理此类 ajax 请求以调用函数的新方法?
【问题讨论】:
【参考方案1】:Ajax + apex 4.2 = apex.server.process api
它要求您在页面的按需进程点或应用程序进程处有一个进程。在其中您必须调用您的函数并提供参数,这些参数可以是页面项。要提供返回,请通过调用htp.p
将值写入http 缓冲区。
DECLARE
some_var1 VARCHAR2(50);
BEGIN
some_var1 := my_package.my_function(:P1_EMPNO, :P1_DEPTNO);
-- write values back
htp.p(some_var1);
END;
您可以轻松地为apex.server.process
提供页面项目。进一步的处理全部在 javascript 中。
警告说明:dataType 默认设置为 JSON,因此如果您不提供其他默认数据类型并且不返回 json 字符串,您将收到解析错误。因此,如果您在按需流程中返回文本(例如 INVALID),请确保将数据类型设置为文本!
apex.server.process ( "MY_PROCESS",
pageItems: "#P1_DEPTNO,#P1_EMPNO"
,
dataType: "text"
, success: function( pData )
//pData should contain VALID or INVALID - alert it
alert(pData);
if ( pData === 'INVALID' )
// do something here when the result is invalid
// maybe you want to color something red for example
alert('The data you have entered is invalid');
;
);
我不会将其拆分为不必要的动态操作,即使它可能是可能的。我个人不喜欢尝试使用 PLSQL 块动态真实动作,只是因为如果要处理返回值,它会更加晦涩难懂。 只需将您的按钮设置为不提交页面,而是由动态操作定义的操作。然后在动态动作中创建一个执行javascript类型的真实动作,并在那里使用带有回调的ajax调用。
【讨论】:
嗨,Tom,再次感谢您的回复,但请咨询一些问题,因为我从未真正使用过 apex.server.process:Q1)我假设您的按需页面进程的名称被称为“我的过程”。 Q2) pageItems 排序是否必须与您在 my_package.my_function(:P1_EMPNO, :P1_DEPTNO) 中的参数的顺序相同,如基于您上面的示例,这似乎不是这种情况? Q3)对不起,我没有完全理解你的真正行动点——你上面的最后一句话。您能否详细说明一下,我是否也需要进行 FALSE 操作?谢谢汤姆。 1) 是的,没错,名称必须匹配! 2)顺序根本不重要。只是将这些项目的值设置为会话状态,以便它们在您的流程中可用 3)通过按下按钮进行 ajax 调用,我认为使用动态操作对单击该按钮做出反应是最简单的。然后,动态操作将具有一个“执行 javascript”类型的真实操作,并且在该操作中您将执行 ajax 调用。 嘿汤姆,真的不知道发生了什么,但看起来我的按需页面进程正在从 apex.server.process 调用,因为我有一个带有提交的插入语句为我提供了结果。但问题是,实际的 apex.server.process 成功部分没有返回任何警报 - 特别是 alert(pData) 甚至没有显示任何内容或没有触发。我认为 htp.p 不起作用。 Chrome 检查器中是否有查看实际结果的方法?不知道我是否错过了任何东西。谢谢。 最好的调试方法是在chrome的开发工具中打开Network选项卡(记住:它必须打开才能捕获网络调用)。让页面加载,清除调用。然后单击您的按钮(或任何触发 ajax 调用的按钮)并检查新添加的行(将是 wwv_flow.show)。检查响应头:里面有什么吗?是否报告了任何 javascript 错误?您可以从开发工具的控制台选项卡中查看这些内容。 没有 javascript 错误,但我不知道我在标题中寻找什么。我要查找按需进程名称吗?以上是关于在 Oracle APEX v4.2.2 中通过 Ajax 调用 Oracle 函数以进行现场验证的主要内容,如果未能解决你的问题,请参考以下文章
穿梭列上的 Oracle APEX 交互式网格过滤器 APEX 19.2
oracle apex 在使用 INSERT INTO 向表中添加数据时给我一个错误
在 Oracle 中通过 SELECT 查询声明变量并设置其值