我有一个主表(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;
/
==========================
答案 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;