问题描述
我有这段代码的工作部分,是更大工作功能的片段。在当前形式下,它在单个实例“DBLINK”上运行,我需要修改它以通过替换 dblink 来动态切换实例。
begin
pNDRZ := RW_DOK_SYstem.create_header@DBLINK( aNMGZ => NULL,aNKNT => pNKNT,aREZR => 'T',aNTPD => pNTPD,aNODD => pNODD,aOPHP => pOPER);
B2B_P_LOG_ADD(pPAKC => 'B2B_P_DRZ_H_NEW',pERRO => sqlERRM,pTEXT => ' 2.1 Tworz naglowek - OK',pDAKT => SYSDATE,pDBLK => pDBLK,pNRZM => pNRZM,pNDRZ => pNDRZ,pPOZC => pPOZC,pNKNT => pNKNT,pNTWR => pNTWR,pILSP => pILSP,pCNSP => pCNSP,pCBSP => pCBSP,pNPRM => pNPRM,pUWAG => pUWAG,pSTAK => dbms_utility.format_call_stack );
exception
when others then
B2B_P_LOG_ADD(pPAKC => 'B2B_P_DRZ_H_NEW',pERRO => sqlERRM||' - '||sqlStatement2,pTEXT => wynik||' 2.1 Tworz naglowek - ERROR',pSTAK => dbms_utility.format_call_stack );
return(0);
end;
关键是这一行,剩下的就是大量的日志和错误处理:
pNDRZ := RW_DOK_SYstem.create_header@DBLINK( aNMGZ => NULL,aOPHP => pOPER);
pNDRZ 是文档的唯一 ID。我需要将该代码修改为动态形式,在函数调用中替换 dblink。
如何动态调用函数,我可以用程序来做到这一点,但我一直坚持这个。 请帮忙。
解决方法
您将需要动态 SQL(如您所料)。这样做
- 创建一个局部变量,用于组合 SQL 语句(在我的示例中为
l_str
)- 为什么不直接使用它?因为动态 SQL 很难调试,所以首先显示它,然后 - 一旦它运行良好 - 执行它
- 如果您发布的代码是存储过程的一部分,您可能会将数据库链接名称作为参数传递。我创建了一个局部变量来达到这个目的 (
l_db_link
)
我已经缩短了你写的那些冗长的命令,没有必要全部写下来。
declare
l_str varchar2(200); -- used to compose a dynamic SQL statement
l_db_link varchar2(30) := 'ORCL';
pndrz number; -- just guessing; I don't know its datatype
begin
l_str := 'select rw_dok_system.create_header@' || l_db_link || '(anmgz => null) from dual';
execute immediate l_str into pndrz;
b2b_p_log_add(ppakc => 'B2B_P_DRZ_H_NEW');
exception
...
end;