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

Oracle 将动态值传递给使用dbms_job.Submit调用的过程,oracle,Oracle,我有一个主表(master_Tab_details),有“table_name”、“Column_name”列,这个主表有180条这样的记录。对于所有这些表,我必须创建相应的图像表。我编写了一个创建图像表的程序,该程序将输入参数设置为“table_name”和“Column_name”。该程序运行良好。 要求是并行地创建所有映像表,我们使用dbms_job.submit来实现这一点,但是当参数化它不起作用时,如果硬编码它就可以正常工作 请帮忙。以下是相关细节 =============== 下面

我有一个主表(master_Tab_details),有“table_name”、“Column_name”列,这个主表有180条这样的记录。对于所有这些表,我必须创建相应的图像表。我编写了一个创建图像表的程序,该程序将输入参数设置为“table_name”和“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 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;
===============================================================

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_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 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;
/

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

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

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;
也就是说,代替正在传递的dbms_作业.submit
'PROC_IMG_BUILD('ABC','ABC_ID');'根据您的硬编码版本,它正在传递
'PROC\u IMG\u BUILD(ABC,ABC\u 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;

请定义“它不工作”。你有错误吗?就业机会没有被创造出来吗?它们是否出现但未运行?主程序不工作,并在此上下文中抛出错误PLS-00357表、视图、序列无效work@BHAVISH:请阅读: