【问题标题】:Calling an Oracle function via Ajax for on-the-spot validation purposes in Oracle APEX v4.2.2在 Oracle APEX v4.2.2 中通过 Ajax 调用 Oracle 函数以进行现场验证
【发布时间】:2014-02-23 19:22:33
【问题描述】:

我正在使用带有 Oracle Apex v4.2.2 的 Oracle 11g,我想知道如何在动态操作中通过 ajax 调用调用 Oracle 函数的最佳方式。

我基本上有一个函数,它接受六个参数,返回“无效”或“有效”的结果。

在我的页面中,我希望能够接受用户输入的值,一旦他们按下按钮进行处理,我需要通过 ajax 检查结果是“无效”还是“有效”并立即呈现用户通过对话框通知他们出现错误。

在 Oracle APEX v4.2.2 中是否有处理此类 ajax 请求以调用函数的新方法?

【问题讨论】:

    标签: javascript ajax oracle11g oracle-apex


    【解决方案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 错误,但我不知道我在标题中寻找什么。我要查找按需进程名称吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多