Oracle PL/SQL 通过动态函数调用将值分配给变量

问题描述

我有这段代码的工作部分,是更大工作功能的片段。在当前形式下,它在单个实例“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;