oracle存储过程带dblink,关于存储过程中的dblink,该如何处理

在Oracle中遇到一个问题,存储过程在编译时因dblink未创建导致失败,但若预先创建dblink则能成功。存储过程内部包含了创建、使用和删除dblink的步骤,奇怪的是即使dblink在存储过程执行后被删除,后续调用仍能成功执行。解决方案是通过动态SQL在打开游标时也使用dblink,确保编译时dblink已存在。
摘要由CSDN通过智能技术生成

关于存储过程中的dblink

我在存储过程中创建了一个dblink,并试图使用。存储过程编译不通过,说(远程)table不存在。但是当我先建好dblink,再编译的时候就好使,并且调用后能够成功执行。我在此存储过程中先创建了dblink,再对远程table操作,最后关闭并删除dblink。也就是说,当调用一次该存储过程后,此dblink就已经不存在了(经查验,确实不存在)。再次调用后依然可以成功执行。

我想问为什么第一次编译的时候非得是dblink存在,才能正确编译。我在存储过程中创建了dblink啊。(存储过程添加了Authid Current_User属性)

附上存储过程的语句

create or replace procedure procedure_test

Authid Current_User

is

crcode varchar2(8);

crname varchar2(60);

ressql varchar2(100);

begin

execute immediate 'create database link REMOTE_DEV_HOST

connect to remote_dev identified by remote_dev

using ''  (DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.13.24)(PORT = 1521))

)

(CONNECT_DATA =

(SID = remote_dev)

(SERVER = DEDICATED)

)

)''';

declare cursor cur1 is

select rcode, rname from table_sour@remote_dev_host;

begin

open cur1;

loop

fetch cur1 into crcode, crname;

exit when cur1%notfound;

select count(*) into ressql from table_des where rcode = crcode;

if(ressql <> '0') then

update table_des set rname = crname where rcode = crcode;

commit;

end if;

end loop;

close cur1;

end cur1;

execute immediate 'alter session close database link REMOTE_DEV_HOST';

execute immediate 'drop database link REMOTE_DEV_HOST';

end;

------解决方案--------------------

因为编译的时候,dblink还没有创建。

你这样打开游标也需要用动态sql, open cur1 for 'select xxx'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值