首页 > 解决方案 > 当 job_action 需要调用具有 CLOB 参数的过程时,如何创建作业

问题描述

我有一个在服务器端调用的过程,我需要使其异步。

所以我创建了另一个 proc,我将在其中创建 Oracle'Job,这将在其 job_action 中调用该 proc。过程是:

  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;

需要调用 IN JOB 的 Proc 是:

    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,因此每当我尝试调用在 JOB 中使用的 PROC 时,它都会引发错误“ORA-06502: PL/SQL: numeric or value error”。

由于 job_action 数据类型为 VARCHAR2(4000);因此,当在 Job 操作中调用 proc 时动态传递 CLOB 数据类型时,它会引发错误“ORA-06502: PL/SQL: numeric or value error”

请就此提出建议。(我们可以使用绑定变量传递参数吗?)

标签: oraclestored-proceduresjobsjob-scheduling

解决方案


CLOB 数据必须来自某个地方。与其将其作为参数传递给过程,不如将其存储在作业可以读取的表中。或者,您可以将原始源作为文件读取,理想情况下作为外部表或 BFILE。


推荐阅读