1

我正在尝试在 Job 中运行 PL/SQL 代码,但即使它运行(如 user_scheduler_jobs 所示),它也不会进行查询。请注意,如果查询是独立运行的,则该查询有效。

Begin
DBMS_SCHEDULER.CREATE_JOB (
    job_name => 'INSERT_LOG',
    job_type => 'PLSQL_BLOCK',
    job_action => 'Begin
        INSERT INTO PORT_ACCIONES (ACCI_USUARIO, ACCI_NOMBRE_APLICACION, ACCI_ID_PAGINA, ACCI_NOMBRE_PAGINA, ACCI_FECHA, ACCI_HORA)
        SELECT APEX_USER, APPLICATION_NAME, PAGE_ID, PAGE_NAME, TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''DD-MM-YYYY''), TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''HH24:MI:SS'')
        FROM apex_workspace_activity_log
        WHERE APEX_USER, APPLICATION_NAME, PAGE_ID, PAGE_NAME, TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''DD-MM-YYYY''), TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''HH24:MI:SS'')
            NOT IN (SELECT ACCI_USUARIO, ACCI_NOMBRE_APLICACION, ACCI_ID_PAGINA, ACCI_NOMBRE_PAGINA, ACCI_FECHA, ACCI_HORA FROM PORT_ACCIONES)
        End;',
    repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
    start_date => SYSTIMESTAMP,
    enabled => TRUE,
    comments => 'Llenado de la tabla de logs de manera automatizada');
End;

这是为了填补

CREATE TABLE  "PORT_ACCIONES" (
    "ACCI_USUARIO" VARCHAR2(255),
    "ACCI_NOMBRE_APLICACION" VARCHAR2(255) NOT NULL ENABLE,
    "ACCI_ID_PAGINA" NUMBER,
    "ACCI_NOMBRE_PAGINA" VARCHAR2(255),
    "ACCI_FECHA" VARCHAR2(255),
    "ACCI_HORA" VARCHAR2(255)
    );

使用 ApEx 提供的日志,确保它不会重复条目并从当前正在使用的应用程序中获取它们。

如果没有,我也可以尝试在 APEX_WORKSPACE_ACTIVITY_LOG 上进行新插入时将注册表添加到 PORT_ACCIONES 表的触发器作为解决方案,但是当我尝试

Create or Replace TRIGGER "PORT_LOGS_BI"
    before insert on apex_workspace_activity_log

,它给了我信息

ORA-25001: cannot create this trigger type on this type of view. Any suggestions would be of great help.

提前非常感谢大家:)

4

3 回答 3

1

:APP_ALIAS 是一个 oracle 顶点变量,它为在顶点会话期间运行代码的应用程序提供指定的别名。但是,计划的作业不会在会话中,因此在运行查询时此变量将为空。

但是请注意,:APP_ALIAS 这不等于应用程序名称!如果您没有更改应用程序属性中的别名,它们的别名将与名称不匹配。

从顶点(页面或应用程序)进程启动作业的更好方法是使用APP_ID, 并application_id在查询中使用。不能这样出错。

如果您想手动启动作业,那么您需要自己提供正确的值,因为您无权访问 apex 会话之外的 apex 替换字符串。

您应该更改为作业提供的 sql。假设您在 apex 会话中运行作业创建,请将 id 连接到:

job_action => 'Begin
               INSERT INTO PORT_ACCIONES (ACCI_USUARIO, ACCI_NOMBRE_APLICACION, ACCI_ID_PAGINA, ACCI_NOMBRE_PAGINA, ACCI_FECHA, ACCI_HORA)
               SELECT APEX_USER, APPLICATION_NAME, PAGE_ID, PAGE_NAME, TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), 'DD-MM-YYYY'), TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''HH24:MI:SS'')
               FROM apex_workspace_activity_log
               WHERE application_id='||:APP_ID ||'
               AND (APEX_USER, APPLICATION_NAME, PAGE_ID, PAGE_NAME, TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''DD-MM-YYYY''), TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''HH24:MI:SS''))
               NOT IN (SELECT ACCI_USUARIO, ACCI_NOMBRE_APLICACION, ACCI_ID_PAGINA, ACCI_NOMBRE_PAGINA, ACCI_FECHA, ACCI_HORA FROM PORT_ACCIONES)
               End;'

或者,如果您想按名称引用:

WHERE application_name='''|| variable_holding_application_name ||'''
于 2012-08-01T07:09:55.840 回答
1

你是如何处理:APP_ALIAS绑定变量的?可能是在提交作业之前未初始化。

另外,我可以看到第一个不single quote匹配TO_CHAR()

TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), 'DD-MM-YYYY')

这应该如下所示,因为整个 PLSQL 块是字符串 text ( VARCHAR)

TO_CHAR(SYSTIMESTAMP - SECONDS_AGO / (60*60*24), ''DD-MM-YYYY'')
于 2012-08-01T00:17:35.027 回答
0

:APP_ALIAS 看起来像一个绑定变量。替代从何而来?也许它是在它工作的环境中定义的。

另外,作业调度程序日志中是否有任何内容?您是否在调度程序中以与客户端相同的用户身份运行?

于 2012-08-01T00:10:39.133 回答