Oracle APEX AJAX 调用失败

Posted

技术标签:

【中文标题】Oracle APEX AJAX 调用失败【英文标题】:Oracle APEX AJAX calls fails 【发布时间】:2016-11-07 22:05:18 【问题描述】:

执行 Oracle Apex onDemand 过程时,出现错误:ORA-01403: no data found。我已经研究了 4 天,但仍然无法正常工作。

    我创建了一个选择列表P1_PLANTS 和一个文本字段P1_LIGHT_REQ

    在我输入的P1_PLANTS的自定义属性字段中

    onchange="getLightRequirements(this, 'P1_LIGHT_REQ')";
    

    html 页面标题中,我输入了以下将调用 onDemand 进程的 javascript

    function getLightRequirements( pThis , pLightReq)
    
        alert('In getLightRequirements\nThis.value is '+pThis.value+'\npLightReq is '+pLightReq);
    
        var ajaxRequest = new htmldb_Get(null,null, 'APPLICATION_PROCESS=getLightRequirements');
    
         ajaxRequest.add( 'P1_PLANTS' , pThis.value);
    
         var ajaxResult = ajaxRequest.get(); 
    
         alert('ajaxResult is '+ajaxResult);
    
    

    下面是onDemand流程

    declare
      light_req varchar2(20);
      P1_PLANTS number;
    begin
      select LIGHT_REQUIREMENTS into light_req from PLANTS
      where PLANT_ID = P1_PLANTS;
    
      htp.prn( light_req );
    end;
    

当我选择植物时,我收到一条警报消息,显示所有参数值都符合预期,错误如下所示。

<html><body><h1>Error occurred while painting error page: ORA-01403: no data found</h1></body></html>

此外,它不会使用错误消息填充“Light Requirements”文本字段。 (尽管过去填充了文本字段 DID。)P1_LIGHT_REQ 的会话状态保护是“不受限制的”。

如果我在 Apex SQL Workshop 中执行 onDemand 过程,硬编码P1_PLANTS 的值,查询运行良好。

如果我将 onDemand 流程最小化为如下所示的代码,我仍然会收到 no data found 错误。

begin
   htp.prn( light_req );
end;

【问题讨论】:

【参考方案1】:

您可能已经从一些在线资源中整理了您使用的代码。 旧了。

自 apex 4.2 以来,我们有了 apex.server.process 函数(apex 5.0 doc link) 将执行 AJAX 调用。htmldb_Get 从那时起就没有记录,即使它会被记录,它现在也会被弃用。除非您对其使用异步调用,它是同步的。这不是“AJAX”中的第一个“A”所代表的意思。浏览器在控制台中提醒您同步请求如何被弃用是有原因的,就像有一个apex 5.1 将不再具有某些内置同步调用(例如动态操作)的原因。 为未来(现在)做好准备,并按应有的方式执行呼叫。不要自学废话。

apex.server.process("getLightRequirements"
                   ,pageItems:"#P1_PLANTS"
                   ,dataType:"text")
  .done(function(pReturn) 
    alert("result is: " + pReturn); 
  )

注意,apex.server.process 默认返回 JSON。要么遵守(应该不难),要么告诉它期待回复。


现在,不要将 javascript 代码放在脚本标记中的“HTML 页面标题”中。同样,从 4.2 开始,您可以将 javascript 代码放在页面级别的为此设计的框中。


同样,停止使用这些“onxxx”属性。有什么要点?动态操作在这里可以很容易地提供帮助,并将可视化您的 JS 正在进行的位置。这些“onxxx”属性开始无处不在:在 SQL 中,在属性中,在代码中,......这是一种害虫,不利于维护。

创建一个对所需项目的更改起作用的动态操作。然后,您可以执行 javascript 代码,例如上面的代码,或调用您指定的函数,甚至从那里执行 PLSQL 代码。在您的情况下,有可能将所有内容置于动态动作中 - 除非您将其作为简单的介绍性练习。


如果您仍在苦苦挣扎,不妨考虑访问 apex.oracle.com 。创建一个新工作区,然后添加一个可以共享凭据的新帐户。以创建您的应用程序和页面为例,然后回复我们(或任何人)并共享工作区名称 + 开发人员凭据。然后人们可以转到您的应用程序并环顾四周,复制内容,更改内容......

【讨论】:

一百万谢谢汤姆!有用!并感谢有关如何使用 Apex 的所有指导。我是 Apex 的新手,在 ColdFusion 中开发了 17 年。您解决了我一直在努力解决的 Apex 的一个方面:去哪里。并感谢有关在 apex.oracle.com 上创建工作区的提示。我相信这会派上用场。 @EdSzwedo 没问题,很高兴它有帮助。我喜欢 apex,但我知道对于那些刚接触技术的人来说,会发现太多信息、博客和论坛帖子,而这些帖子通常仍在处理旧的或过时的信息/知识,这有点痛苦。【参考方案2】:

在您的按需流程中,您不需要声明 P1_PLANTS,您需要将其用作 bind variable(这就是您将其添加到 ajax 请求中的原因),如下所示:

declare
    light_req varchar2(20);

begin
    select LIGHT_REQUIREMENTS into light_req 
    from PLANTS
    where PLANT_ID = :P1_PLANTS; /*Notice the colon in front of P1_PLANTS this indicates a bind variable*/

    htp.prn( light_req );

end;

就是这样。

编辑:

我之前没有注意到,但您应该做的另一件事是使用 $v() 函数在 javascript 上获取项目的值,如下所示:

ajaxRequest.add( 'P1_PLANTS' , $v('P1_PLANTS'));

当您声明时:

onchange="getLightRequirements(this, 'P1_LIGHT_REQ')";

实例“this”引用的是事件对象,而不是项目本身。

【讨论】:

谢谢,但还是不行。我是如此充满希望。当我在 SQL Workshop 中运行代码并将 P1_PLANTS 更改为绑定变量 (:P1_PLANTS) 时,我会收到一个很好的提示来输入一个值。当我输入一个值时,查询工作正常。当我运行该应用程序时,我仍然没有找到任何数据。 再次感谢,但它仍然不起作用。同样的错误。顺便说一句,使用 $v('P1_PLANTS') 或 pThis.value 都将相同的值传递给 ajaxAdd 调用。

以上是关于Oracle APEX AJAX 调用失败的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle APEX v4.2.2 中通过 Ajax 调用 Oracle 函数以进行现场验证

使用 Oracle APEX 对自签名、未经认证的网站进行 REST 调用

调用程序 Oracle apex

JavaScript 调用`setTimeout` 在 Oracle Apex 中不起作用

从 apex 页面进程调用 pl/sql 函数

Oracle APEX 应用程序包中匿名块的执行点