1

ジョブ内で 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 apex 変数であり、apex セッション中にコードが実行されるアプリケーションに指定されたエイリアスを提供します。ただし、スケジュールされたジョブはセッション内にないため、クエリの実行時にはこの変数は空になります。

ただし、アプリケーション名と同じで:APP_ALIAS はないことに注意してください。アプリケーション プロパティでエイリアスを変更していない場合、エイリアスは名前と一致しません。

apex (ページまたはアプリケーション) プロセスからジョブを起動するより良い方法は、クエリで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ブロック全体が文字列テキストであるため、これはむしろ以下のようになります( 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 に答える