oracle - 如何在使用 DBMS_SCHEDULER.CREATE_JOB 创建的作业中运行复杂的 PL/SQL 代码

标签 oracle plsql oracle11g oracle-apex database

我正在尝试在作业中运行 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.

非常感谢大家:)

最佳答案

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

此外,我可以在第一个 TO_CHAR() 上看到一个单引号 不匹配

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

这应该如下所示,因为整个 PLSQL block 是一个字符串文本 (VARCHAR)

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

关于oracle - 如何在使用 DBMS_SCHEDULER.CREATE_JOB 创建的作业中运行复杂的 PL/SQL 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11750768/

相关文章:

java - 检查 Oracle 数据库中是否存在用户 - java jdbc

mysql - 在多列中查找值的范围

stored-procedures - Oracle 中存储过程的默认值

sql - 如何在函数中返回删除的行数(删除所有语句)?

sql - Oracle 虚拟列引用另一个表

python - spark 从 oracle 导入数据 - java.lang.ClassNotFoundException : oracle. jdbc.driver.OracleDriver

oracle - 查找数据泵转储文件中使用的表空间

java - 来自 JDBC 的 PL/SQL 调用导致 "SQLSyntaxErrorException: ORA-00900"

database - Oracle DB 监听器是否仅绑定(bind)到私有(private) ip 地址?

sql - 使用批量插入在 oracle 中的表之间移动大数据