当 job_action 需要调用具有 CLOB 参数的过程时,如何创建作业

Posted

技术标签:

【中文标题】当 job_action 需要调用具有 CLOB 参数的过程时,如何创建作业【英文标题】:How to create a job, when job_action need to call a procedure having CLOB parameter 【发布时间】:2018-05-02 07:43:22 【问题描述】:

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

所以我创建了另一个 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”

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

SYSTIMESTAMP 返回一个TIMESTAMP WITH TIME ZONE 值,所以FROM_TZ(SYSTIMESTAMP, 'US/Eastern') 没有用,它实际上应该返回一个错误。

job_action的数据类型是VARCHAR2,即最多32K个字符,所以CLOB是不可能的。

和 APC 一样,我推荐使用 BFILE 或外部表进行处理。

【讨论】:

以上是关于当 job_action 需要调用具有 CLOB 参数的过程时,如何创建作业的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何导出具有clob字段类型的sql?

ORACLE 当字段中有数据如何修改字段类型

从 Clob 列中提取 XML 标记值,在 Oracle 中具有多个具有相同名称的标记

在存储的 CLOB 中包含自动递增值

如何导出含有CLOB字段的表数据

如何从 SQL 查询处理 Excel 中的 Clob 数据类型