日期:2014-05-17  浏览次数:20909 次

关于存储过程中的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'