在 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>
我有一个问题,我想要一个页面浏览统计数据并通过 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>