将动态值传递给使用dbms_job.Submit调用的过程

时间:2018-04-05 07:16:32

标签: oracle

我有一个主表(Master_Tab_details),其列为" Table_name"," Column_name" ,这个Master表有180个这样的记录。对于所有这些表,我必须创建相应的图像表。我有一个编写过程来创建图像表,它将输入参数作为" Table_name"和#34; Column_name"这个程序运作正常。 要求是创建所有图像表并行,我们使用dbms_job.submit来实现,但是当参数化它不工作时,如果硬编码它工作正常。

请帮助。以下是相关细节。

=============== 以下是用于触发参数化过程的并行执行的主要程序

CREATE OR REPLACE PROCEDURE PROC_IMG_BUILD_MASTER
AS
l_job NUMBER;
BEGIN
for o in (select TABLE_NAME,TABLE_PK
from MASTER_TABLE)
loop
dbms_job.submit(job =>l_job, what =>'PROC_IMG_BUILD( ' || o.TABLE_NAME || ',' || o.TABLE_PK || ' );');
end loop;
COMMIT;
COMMIT;
END;

=============================================== ================

create table master_table (table_name varchar2(100),table_pk varchar2(100))
create table ABC (ABC_ID varchar2(100))
create table XYZ (XYZ_ID varchar2(100))
create table I_ABC (ABC_ID varchar2(100))
create table I_XYZ (XYZ_ID varchar2(100))
insert into master_table VALUES('ABC','ABC_ID');
insert into master_table VALUES('XYZ','XYZ_ID');
COMMIT;

====================================== 从主程序

调用此过程
CREATE OR REPLACE PROCEDURE PROC_IMG_BUILD (TABLE_NAME VARCHAR2,TABLE_PK VARCHAR2) AS
STMT VARCHAR2(200);
TRUNC_STMT VARCHAR2(200);
BEGIN
TRUNC_STMT:='TRUNCATE TABLE I_'||TABLE_NAME;
EXECUTE IMMEDIATE TRUNC_STMT;
STMT:='INSERT INTO I_'||TABLE_NAME||' SELECT '||TABLE_PK||' FROM  '||TABLE_NAME||' ;
EXECUTE IMMEDIATE STMT;
COMMIT;
END;

========================================== - *****当硬编码参数时,使用Submit的下面的块工作正常。

DECLARE
l_job NUMBER;
BEGIN
dbms_job.submit(job =>l_job,
what =>'PROC_IMG_BUILD( ''ABC'',''ABC_ID'');');
COMMIT; 
END;
/

==========================

1 个答案:

答案 0 :(得分:1)

问题在于您忽略了在什么参数中包含单引号。

即。而不是根据你的硬编码版本传递'PROC_IMG_BUILD( ''ABC'',''ABC_ID'');'的dbms_job.submit,它被传递'PROC_IMG_BUILD( ABC,ABC_ID);',因此你得到了错误。

您的程序应如下所示:

CREATE OR REPLACE PROCEDURE proc_img_build_master AS
  l_job NUMBER;
BEGIN
  FOR o IN (SELECT table_name,
             table_pk
        FROM   master_table)
  LOOP
    dbms_job.submit(job => l_job,
                    what => 'PROC_IMG_BUILD( ''' || o.table_name || ''',''' || o.table_pk || ''' );');
  END LOOP;

  COMMIT;
END proc_img_build_master;