Plsql 在更新表后,每次连接不同的数据库时动态创建和删除db_链接
我想创建PL-SQL过程,该过程从一个db远程连接和更新各种db,并通过创建动态db_链接更新每个db上的表,每次更新所有db中的表后,都应该创建并删除该db_链接。我们怎么做?请提供帮助。警告:创建和删除动态db链接存在安全漏洞,因为表必须存储每个远程帐户的密码 1-创建一个表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
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_链接。非常感谢您的帮助。我已经写了代码,它工作得非常好。非常感谢阿尔瓦隆戈。