Plsql 在更新表后,每次连接不同的数据库时动态创建和删除db_链接

Plsql 在更新表后,每次连接不同的数据库时动态创建和删除db_链接,plsql,Plsql,我想创建PL-SQL过程,该过程从一个db远程连接和更新各种db,并通过创建动态db_链接更新每个db上的表,每次更新所有db中的表后,都应该创建并删除该db_链接。我们怎么做?请提供帮助。警告:创建和删除动态db链接存在安全漏洞,因为表必须存储每个远程帐户的密码 1-创建一个表 Table name: REMOTE_INFO host_name varchar2(25) primary_key, username_remote varchar2(30), password_r

我想创建PL-SQL过程,该过程从一个db远程连接和更新各种db,并通过创建动态db_链接更新每个db上的表,每次更新所有db中的表后,都应该创建并删除该db_链接。我们怎么做?请提供帮助。

警告:创建和删除动态db链接存在安全漏洞,因为表必须存储每个远程帐户的密码

1-创建一个表

Table name: REMOTE_INFO

host_name        varchar2(25) primary_key,
username_remote  varchar2(30),
password_remote  varchar2(30),
host_connection  varchar2(30),
table_local      varchar2(30),
schema_remote    varchar2(30),
table_remote     varchar2(30),
condition        varchar2(4000)
双包装规格

create or replace package pk_remote
is
  /* ====================================================================================================
  -- ref: question on
  -- https://stackoverflow.com/questions/56339278/creating-and-dropping-dynamically-db-link-each-time-connecting-various-dbs-after
  -- 2019-05-30 by alvalongo
  ==================================================================================================== */
  kLINE_FEED   constant varchar2(1):=chr(10);
  --
  procedure pr_copy(p_iHost        varchar2,
                    p_oError   out number,
                    p_oMessage out varchar2
                   );
End pk_remote;
三包体

create or replace package body pk_remote
is
  /* ====================================================================================================
  -- ref: question on
  -- https://stackoverflow.com/questions/56339278/creating-and-dropping-dynamically-db-link-each-time-connecting-various-dbs-after
  -- 2019-05-30 by alvalongo
  ==================================================================================================== */
  --
  procedure pr_copy(p_iHost        varchar2,
                    p_oError   out number,
                    p_oMessage out varchar2
                   )
  is
    rcRemote   remote_info%rowtype;
    vLink_name varchar2(30);
    vSentence  varchar2(2000);
    ex_exit    exception;
  Begin
    p_oError:=0;
    p_oMessage:=null;
    if p_iHost is null then
       p_oError:=100;
       p_oMessage:='HOST cannot be null';
       raise ex_exit;
    End if;
    Begin
      select a.*
      into rcRemote
      from remote_info a
      where a.host_name=upper(trim(p_iHost));
    Exception
      when no_data_found then
           p_oError:=sqlcode;
           p_oMessage:='There is no host='||upper(trim(p_iHost));
           raise ex_exit;
    end;
    --
    vLink_name:=upper('DBL_'||rcRemote.host_name);
    --
    vSentence:=  'CREATE DATABASE LINK '||vLink_name||kLINE_FEED
               ||'CONNECT TO '||rcRemote.username_remote||kLINE_FEED
               ||'IDENTIFIED BY '||rcRemote.password_remote||kLINE_FEED
               ||'USING '||rcRemote.host_connection;
     --
     Begin
      execute immediate vSentence;
     Exception
      when others then
           p_oError:=sqlcode;
           p_oMessage:='Error creating db link:'||sqlerrm;
           raise ex_exit;
     end;
    --
    vSentence:=  'insert into '||rcRemote.schema_remote||','||rcRemote.table_remote||'@'||vLink_name||kLINE_FEED
               ||'select *'||kLINE_FEED
               ||'from '||rcRemote.table_local||' a'||kLINE_FEED
               ||'where '||rcRemote.condition;
     Begin
      execute immediate vSentence;
     Exception
      when others then
           p_oError:=sqlcode;
           p_oMessage:='Error inserting:'||sqlerrm;
           raise ex_exit;
     end;
    --
    vSentence:=  'drop DATABASE LINK '||vLink_name;
     --
     Begin
      execute immediate vSentence;
     Exception
      when others then
           p_oError:=sqlcode;
           p_oMessage:='Error dropping db link:'||sqlerrm;
           raise ex_exit;
     end;
  Exception
    when ex_exit then
         null;
    when others then
         p_oError:=sqlcode;
         p_oMessage:=sqlerrm;
  End pr_copy;
  --
End pk_remote;

为什么每次更新表后都要创建和删除?感谢Alvalongo的回复。实际上,我的表的数据来自MView,每次都必须刷新它并用新记录重新加载表,如果我想更新100个分布式db表,我不想保留100个db_链接。因此,每次更新完成后,都应该删除db_链接。非常感谢您的帮助。我已经写了代码,它工作得非常好。非常感谢阿尔瓦隆戈。