Oracle APEX AJAX调用失败

时间:2016-11-07 22:05:19

标签: oracle oracle-apex

执行Oracle Apex onDemand过程时,出现错误:ORA-01403: no data found。我已经研究了4天了,仍然无法让它发挥作用。

  1. 我创建了一个选择列表P1_PLANTS和一个文本字段P1_LIGHT_REQ
  2. 在我输入的P1_PLANTS的自定义属性字段中

    onchange="getLightRequirements(this, 'P1_LIGHT_REQ')";
    
  3. 在HTML页面标题中,我输入了以下JavaScript,它将调用onDemand进程。

    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);
    }
    
  4. 以下是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;
    
  5. 当我选择工厂时,我收到警告消息,显示所有参数值都符合预期,错误如下所示。

    <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进程最小化到下面显示的代码,我仍然会收到无数据错误。

    begin
       htp.prn( light_req );
    end;
    

2 个答案:

答案 0 :(得分:0)

在您的点播流程中,您不需要声明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')";

实例&#34;这个&#34;引用事件对象,而不是项目本身。

答案 1 :(得分:0)

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

由于apex 4.2我们已经拥有了apex.server.process函数(apex 5.0 doc link),它将执行AJAX调用。htmldb_Get从未被记录过,即使它会被记录,它也会#&# 39; d现在不推荐使用。除非你在它上面使用异步调用,否则它是不会发生的。这不是第一个&#34; A&#34;&#34; AJAX&#34浏览器在控制台中提醒您同步请求的弃用方式是有原因的,就像apex 5.1不再具有某些内置同步调用(如动态操作)的原因一样。 为未来做好准备(现在是这样)并按照应有的方式进行呼叫。不要自学老东西。

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

请注意,apex.server.process默认情况下需要JSON。要么遵守(不应该很难),要么告诉它要回复文本。

现在,不要将javascript代码放在&#34; HTML页面标题中#34;在脚本标签中。再次,从4.2开始,您可以在页面级别将javascript代码放在其中设计的框中。

同样,停止使用这些&#34; onxxx&#34;属性。有什么意义?动态操作可以在这里轻松提供帮助,并可视化JS正在进行的位置。这些&#34; onxxx&#34;属性开始遍布整个地方:在SQL中,在属性中,在代码中,......它是一种害虫,它对维护是有害的。

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

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