在Oracle PLSQL中接收db链接名称作为变量

时间:2014-01-13 14:51:06

标签: oracle plsql oracle11g

我在 PLSQL 中有以下功能,它远程连接到不同的数据库链接以更改密码:

FUNCTION fun_change_password(DB_LINK_VARIABLE varchar2)
    RETURN binary_integer IS

    jobid binary_integer;

  BEGIN
      dbms_job.submit@DB_LINK_VARIABLE (jobid,'begin execute immediate ''alter user MYUSER identified by mypassw''; end;');
      COMMIT;
      RETURN jobid;
  END;

我的目标是指定在名为* DB_LINK_VARIABLE *的varchar2变量中使用哪个DB Link发送其名称。但是当我将它编译成一个包时,解析器会向我发送一个错误:

  

PLS-00352:无法访问其他数据库“DB_LINK_VARIABLE”

显然,我预先配置并测试了所有数据链接并且运行良好。

如何在此代码中使用变量“DB_LINK_VARIABLE”?

2 个答案:

答案 0 :(得分:2)

您可以通过执行匿名PL / SQL块来使用dynamic SQL执行此操作。

下面是一个简单的例子,我通过数据库链接执行dbms_utility.get_time函数。

$ cat so35.sql
declare
  function remote_time(p_dblink in varchar2) return number is
    v_time number; 
  begin  
    execute immediate
      'begin :time := dbms_utility.get_time@' || p_dblink || '; end;'
    using out v_time;
    return v_time;
  end;
begin
  dbms_output.put_line('time = ' || remote_time('foo'));
end;
/


SQL> select dbms_utility.get_time as local, dbms_utility.get_time@foo as remote from dual;

     LOCAL     REMOTE
---------- ----------
  77936814 1546395927

SQL> @so35.sql
time = 1546396850

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:1)

PLS-00352: Unable to access another database 'DB_LINK_VARIABLE'

错误消息显示,oracle正在查找名为DB_LINK_VARIABLE的数据库链接,而不是与之关联的值。

您可能需要检查变量,并对db链接进行硬编码,而不是使用绑定变量。!

Functions是DB中的编译代码,所以我想oracle会在编译过程中对此进行语义检查,而不是在运行时进行。

如果只是对远程数据库进行SQL调用,则会使用EXECUTE IMMEDIATE。由于它是PL/SQL,因此没有办法,但有多个IF条件,验证变量名称,并在PL/SQL块中创建全名。