1

我的 ajax 回调(PL/SQL)中有以下代码:

:P1_CNT := TO_NUMBER(:P1_CNT) + 1;
apex_util.set_session_state
     (p_name  => 'P1_CNT'
     ,p_value => :P1_CNT
     );

这似乎工作得很好。但是随后调用了一个过程来检查页面项目和页面项目是否出现为 0,即使在回调中它被设置为 1。我该如何解决这个问题?

调用 ajax 的代码是下面的 javascript,从自定义动态操作执行:

for ( var i=0; i<records.length; i++) {
        apex.server.process
            ("my_ajax_callback"
            ,{x01:records[i][1]}
            ,{type:'GET', dataType: 'text', success: function( text) {}}
            );
}


apex.page.submit( 'COMPLETE_PROCESS_RECORDS' );

其中 COMPLETE_PROCESS_RECORDS 是在循环中的所有记录都被 ajax 回调处理后执行的进程。ajax 回调评估传递给它的每条记录并处理一些记录并丢弃其他记录。每次进一步处理记录时,P1_CNT 都会增加。

4

1 回答 1

2

您没有向我们展示调用 Ajax 回调的代码,但基本上,有服务器端(在本例中为 PL/SQL)和客户端 (JavaScript) 代码。为了让服务器从客户端获取值,您必须在调用 Ajax 回调时将它们发送进来。这就是pData参数的用途: https ://docs.oracle.com/en/database/oracle/application-express/19.2/aexjs/apex.server.html#.process

您可以根据发送方式以不同方式访问发送到服务器端代码的值。例如,如果您使用 发送值x01,则可以使用 PL/SQL 代码在您的 PL/SQL 代码中引用它apex_application.g_x01

当然,有时您需要从服务器端获取值到客户端。为此,您通常会从 PL/SQL 代码发送 HTTP 响应。这是一个发送 JSON 对象的示例:

apex_json.open_object();
apex_json.write('hello', 'world');
apex_json.close_object();

然后,您需要更新客户端代码以查看并使用 HTTP 响应将值映射到您需要的页面/DOM 的任何部分。

这是非常典型的,如果您使用动态操作框架而不是原始 JavaScript,APEX 团队会非常简单。有一个名为 Execute PL/SQL 的操作具有名为Items to SubmitItems to Return的属性,可以为您完成繁重的工作。

执行 PL/SQL

于 2019-12-10T19:27:35.023 回答