Oracle APEX AJAX 调用失败
Oracle APEX AJAX calls fails
执行 Oracle Apex onDemand 过程时,出现错误:ORA-01403: no data found
。我已经对此进行了 4 天的研究,但仍然无法正常工作。
- 我创建了一个 select 列表
P1_PLANTS
和一个文本字段 P1_LIGHT_REQ
我在 P1_PLANTS
的自定义属性字段中输入了
onchange="getLightRequirements(this, 'P1_LIGHT_REQ')";
在 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);
}
下面是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 进程最小化为如下所示的代码,我仍然会收到未找到数据错误。
begin
htp.prn( light_req );
end;
在您的按需流程中,您不需要声明 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" 引用的是事件对象,而不是项目本身。
您可能已经从一些在线资源中整理了您使用的代码。
老了。
自 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 page header" 中。同样,从 4.2 开始,您可以将 javascript 代码放在页面级别为此设计的框中。
同样,停止使用这些 "onxxx" 属性。有什么意义呢?动态动作在这里可以很容易地提供帮助,并且会可视化你在哪里进行 JS。这些 "onxxx" 属性开始到处都是:在 SQL 中,在属性中,在代码中,......这是一种害虫,不利于维护。
创建一个动态动作,它作用于所需项目的变化。然后您可以执行 javascript 代码,例如上面的代码,或调用您指定的函数,甚至从那里执行 PLSQL 代码。在您的情况下,有可能将所有内容都放在动态动作中 - 除非您将其作为简单的介绍性练习来进行。
如果您仍在苦苦挣扎,不妨考虑前往 apex.oracle.com。创建一个新的工作区,然后添加一个可以共享凭据的新帐户。创建您的应用程序和页面作为示例,然后返回给我们(或任何人)并共享工作区名称 + 开发人员凭据。然后人们可以转到您的应用程序并环顾四周,复制内容,更改内容,...
执行 Oracle Apex onDemand 过程时,出现错误:ORA-01403: no data found
。我已经对此进行了 4 天的研究,但仍然无法正常工作。
- 我创建了一个 select 列表
P1_PLANTS
和一个文本字段P1_LIGHT_REQ
我在
P1_PLANTS
的自定义属性字段中输入了onchange="getLightRequirements(this, 'P1_LIGHT_REQ')";
在 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); }
下面是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 进程最小化为如下所示的代码,我仍然会收到未找到数据错误。
begin
htp.prn( light_req );
end;
在您的按需流程中,您不需要声明 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" 引用的是事件对象,而不是项目本身。
您可能已经从一些在线资源中整理了您使用的代码。 老了。
自 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 page header" 中。同样,从 4.2 开始,您可以将 javascript 代码放在页面级别为此设计的框中。
同样,停止使用这些 "onxxx" 属性。有什么意义呢?动态动作在这里可以很容易地提供帮助,并且会可视化你在哪里进行 JS。这些 "onxxx" 属性开始到处都是:在 SQL 中,在属性中,在代码中,......这是一种害虫,不利于维护。
创建一个动态动作,它作用于所需项目的变化。然后您可以执行 javascript 代码,例如上面的代码,或调用您指定的函数,甚至从那里执行 PLSQL 代码。在您的情况下,有可能将所有内容都放在动态动作中 - 除非您将其作为简单的介绍性练习来进行。
如果您仍在苦苦挣扎,不妨考虑前往 apex.oracle.com。创建一个新的工作区,然后添加一个可以共享凭据的新帐户。创建您的应用程序和页面作为示例,然后返回给我们(或任何人)并共享工作区名称 + 开发人员凭据。然后人们可以转到您的应用程序并环顾四周,复制内容,更改内容,...