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;