Как создать вакансию, когда job_action нужно вызвать процедуру, имеющую параметр CLOB - PullRequest
0 голосов
/ 02 мая 2018

У меня есть процедура, которая вызывается на стороне сервера, и мне нужно сделать ее асинхронной.

Итак, я создал еще один процесс, в котором я создам Oracle'Job, и он будет вызывать этот процесс в его job_action. Процесс это:

  PROCEDURE upload_csv_file_data(a_what_to_do IN VARCHAR2,
                             a_logon_user IN VARCHAR2,
                             a_csv_data IN CLOB)
  IS
    v_job_action  VARCHAR2(32676);
    /*v_log_error   VARCHAR2(32676);*/
    v_job_name    VARCHAR2(100);
  BEGIN

    v_job_action := 'process_csv_file_data(''' || a_what_to_do || ''',''' || a_logon_user || ''',' || a_csv_data || ');';
    v_job_name    := 'UPLOAD_CSV_FILE_DATA';



    sys.dbms_scheduler.create_job(
        job_name => v_job_name,
        job_type => 'PLSQL_BLOCK',
        job_action => 'begin ' || v_job_action || ' EXCEPTION WHEN OTHERS THEN NULL; end;',
        start_date => SYSTIMESTAMP,
        job_class => 'BATCH_CLASS',
        comments => 'Start uplaoding CSV file data.',
        auto_drop => TRUE,
        enabled => TRUE);

  END;

Proc, который нужно назвать IN JOB:

    CREATE OR REPLACE PROCEDURE process_csv_file_data(a_what_to_do IN VARCHAR2,
                                 a_logon_user IN VARCHAR2,
                                 a_csv_data IN CLOB)
    IS
    .
       /*STEPS*/
    .
    END;

Но так как одним из параметров передачи для этого PROC является CLOB, следовательно, всякий раз, когда я пытаюсь вызвать это использование PROC в JOB, выдается ошибка «ORA-06502: PL / SQL: ошибка числового значения или значения».

Поскольку тип данных job_action имеет тип VARCHAR2 (4000); и, следовательно, в тот момент, когда тип данных CLOB динамически передается при вызове proc в действии Job, он выдает ошибку «ORA-06502: PL / SQL: ошибка числа или значения»

Просьба предложить по этому вопросу. (можем ли мы передать параметры, используя переменные связывания?)

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

SYSTIMESTAMP возвращает значение TIMESTAMP WITH TIME ZONE, поэтому FROM_TZ(SYSTIMESTAMP, 'US/Eastern') бесполезно и фактически должно возвращать ошибку.

Тип данных job_action равен VARCHAR2, т. Е. До 32 КБ символов, поэтому CLOB невозможен.

Как и APC, для обработки я рекомендую BFILE или внешнюю таблицу.

0 голосов
/ 02 мая 2018

Данные CLOB должны откуда-то приходить. Вместо того, чтобы передавать его как параметр в процедуру, вы должны сохранить его в таблице, которую может прочитать задание. В качестве альтернативы вы можете прочитать исходный источник как файл, в идеале как внешнюю таблицу или как BFILE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...