当 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 参数的过程时,如何创建作业的主要内容,如果未能解决你的问题,请参考以下文章