在 APEX ORACLE 中通过 API 从 table "apex_activity_log" 收集数据

collect data via API from the table "apex_activity_log" in APEX ORACLE

我有一个问题,我想要一个页面浏览统计数据并通过 REST 发送它们。 这是我的要求:

         select count (*)
           from apex_activity_log l
             where flow_id = 100
                 and time_stamp> = sysdate - (1/24/60/60 * 2419200)
                 and userid is not null
                 and step_id = 172
            ;

    answer : 867

此查询在“SQL 命令”中效果很好。但是当我在 Packages 中使用这个查询时,我得到 0。虽然答案应该完全不同。我如何让包访问 apex_activity_log。正确的答案又回到了我身边。谢谢)

我的 api 在包中:

PROCEDURE post_connect_service (   
        p_status   OUT NUMBER,   
        p_blob     IN BLOB   
    ) IS   
   
        v_blob blob :=    p_blob;   
        v_clob            CLOB;   
        tv                apex_json.t_values;   
        v_id    varchar2(1000);   
        v_number    varchar2(1000);      
        v_date_last date;  
        v_count_v_pl     int;
        v_count_sum_v     int;
    BEGIN   
        v_clob := iot_general.blob_to_clob(v_blob);   
        apex_json.parse(tv,v_clob);    
        v_id  := apex_json.get_varchar2(p_path => 'id', p_values => tv);   
     
         select  count(*) into v_count_sum_v
            from apex_activity_log;

        p_status := 200;   
        apex_json.open_object;   
        apex_json.write('success', true);          
        apex_json.write('count_views', v_count_v_pl);  
        apex_json.write('count_sum_views', v_count_sum_v);
        apex_json.close_object;   
    EXCEPTION   
        WHEN OTHERS THEN   
            p_status := 500;   
            apex_json.open_object;   
            apex_json.write('success', false);   
            apex_json.write('message', substr(sqlerrm,1,4000));   
            apex_json.close_object;   
END post_connect_service;

首先,在 ORDS 中有一个 pre-configured REST API。 https://docs.oracle.com/en/database/oracle/oracle-database/21/dbrst/api-oracle-apex.html

回答您的实际问题:

  • 您的程序 运行 是否与应用程序 100 在同一工作区内?或者您是否依赖 APEX_ADMINISTRATOR_ROLE 来达到 return 行?
  • 如果是后者,请确保使用 AUTHID CURRENT_USER 创建您的程序包或过程,以确保它...
    • a) 运行s 具有调用用户的权限
    • b) 在 PL/SQL 执行期间启用了角色(例如 APEX_ADMINISTRATOR_ROLE)。

视图 apex_activity_log 具有当前顶点上下文的数据。如果在顶点上下文之外查询它,它将 return 没有行。最简单的方法是在查询之前创建一个顶点会话。

koen>SELECT COUNT(*) FROM apex_activity_log;

   COUNT(*) 
___________ 
          0 

koen>DECLARE
  2  BEGIN
  3    apex_session.create_session (
  4       p_app_id => 286,
  5       p_page_id => 1,
  6       p_username => 'JOHN.DOE');
  7  END;
  8* /

PL/SQL procedure successfully completed.

koen>SELECT COUNT(*) FROM apex_activity_log;

   COUNT(*) 
___________ 
       9327 

koen>