在Oracle APEX v4.2.2中,通过Ajax调用Oracle函数进行即时验证的目的

3
我正在使用Oracle 11g和Oracle Apex v4.2.2,我想知道通过ajax调用Oracle函数的最佳方式,以在动态操作中使用。
我有一个函数,它需要六个参数,返回“INVALID”或“VALID”的结果。
在我的页面上,我希望能够接受用户输入的值,一旦他们按下处理按钮,我需要通过ajax检查结果是否为“INVALID”或“VALID”,并立即向用户呈现对话框,通知他们出现了错误。
在Oracle APEX v4.2.2中,是否有新的处理此类型ajax请求以调用函数的方法?
1个回答

5
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),请确保将数据类型设置为text!

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块的动态true action,因为如果您想处理返回值,则更加难以执行。
只需将按钮设置为不提交页面,而是动态动作定义的操作。然后,在动态操作中创建一个类型为执行javascript的true action,并在其中使用ajax调用和回调函数。


嗨Tom,再次感谢您的回复,但我有几个问题,请教一下,因为我从未实际使用过apex.server.process:Q1)我假设您的按需页面进程的名称为“MY_PROCESS”。 Q2)pageItems排序是否必须与您在my_package.my_function(:P1_EMPNO,:P1_DEPTNO)中作为参数的相同顺序匹配?根据您上面的示例,似乎并非如此? Q3)抱歉,我没有完全理解您的真正行动点-您上面的最后一句话。您能否详细说明一下,并且我还需要有一个FALSE操作吗?谢谢Tom。 - tonyf
  1. 是的,没错,名称必须匹配!
  2. 顺序完全不重要。它只是为了将这些项目的值设置在会话状态中,以便在您的进程中可用。
  3. 为了通过按下按钮来进行ajax调用,我认为使用动态操作以响应该按钮的单击是最容易的。然后,动态操作将具有一个真实的“执行javascript”类型的操作,在该操作中,您将执行ajax调用。
- Tom
嘿Tom,我真的不确定发生了什么事情,但看起来我的按需页面进程是从apex.server.process中调用的,因为我有一个插入语句和提交提供给我结果。但问题是,实际的apex.server.process成功部分没有返回任何警报 - 特别是alert(pData)根本没有显示任何东西或没有触发。我不认为htp.p正在工作。在Chrome检查器中有没有办法查看实际结果?不确定是否有遗漏任何内容。谢谢。 - tonyf
调试的最佳方式是在Chrome开发工具的网络选项卡中打开(记住:必须打开才能捕获网络调用)。让页面加载,清除调用。然后点击您的按钮(或任何触发ajax调用的内容)并检查新添加的行(将显示为wwv_flow.show)。检查响应头:有什么东西吗?是否报告了任何JavaScript错误?您可以从开发工具中的控制台选项卡中查看这些信息。 - Tom
你可以尝试使用 apex.debug(...) 在 Chrome 中查看结果。这是 console.log(..) 的包装器,但不会在 IE8 中引起错误(除非打开开发工具,否则 console.log 会在 IE8 中产生 js 错误)。 - Tom
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接