Oracle PL/SQL 通过动态函数调用给变量赋值
Oracle PL/SQL asinging value to variale by dynamic funcion call
我有代码的这个工作部分,是更大工作功能的一个片段。在当前形式下,它在单个实例“DBLINK”下运行,我需要通过替换 dblink.
将其修改为动态 s 实例
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', 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 );
return(0);
end;
重点是这一行,其余是海量日志和错误处理:
pNDRZ := RW_DOK_SYSTEM.create_header@DBLINK( aNMGZ => NULL, aNKNT => pNKNT , aREZR => 'T' , aNTPD => pNTPD, aNODD => pNODD , aOPHP => pOPER);
pNDRZ 是文档的唯一 ID。我需要将该代码修改为 中的动态形式,我在函数调用中替换了 dblink。
如何动态调用函数,我可以用过程来做到这一点,但我一直坚持这个。
请帮忙。
您将需要动态 SQL(如您所料)。为此
- 创建一个局部变量,该变量将用于组成 SQL 语句(在我的示例中为
l_str
)
- 为什么不直接使用呢?因为动态 SQL 很难调试所以首先显示它并且 - 一旦它运行良好 - 执行它
- 如果您发布的代码是存储过程的一部分,您可能会将数据库 link 名称作为参数传递。为此,我创建了一个局部变量 (
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;
我有代码的这个工作部分,是更大工作功能的一个片段。在当前形式下,它在单个实例“DBLINK”下运行,我需要通过替换 dblink.
将其修改为动态 s 实例 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', 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 );
return(0);
end;
重点是这一行,其余是海量日志和错误处理:
pNDRZ := RW_DOK_SYSTEM.create_header@DBLINK( aNMGZ => NULL, aNKNT => pNKNT , aREZR => 'T' , aNTPD => pNTPD, aNODD => pNODD , aOPHP => pOPER);
pNDRZ 是文档的唯一 ID。我需要将该代码修改为 中的动态形式,我在函数调用中替换了 dblink。
如何动态调用函数,我可以用过程来做到这一点,但我一直坚持这个。 请帮忙。
您将需要动态 SQL(如您所料)。为此
- 创建一个局部变量,该变量将用于组成 SQL 语句(在我的示例中为
l_str
)- 为什么不直接使用呢?因为动态 SQL 很难调试所以首先显示它并且 - 一旦它运行良好 - 执行它
- 如果您发布的代码是存储过程的一部分,您可能会将数据库 link 名称作为参数传递。为此,我创建了一个局部变量 (
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;