oracle - 接收数据库链接名称作为 Oracle PLSQL 中的变量

标签 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 变量中发送其名称。但是当我将其编译成包时,解析器向我发送一个错误:

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

显然,我预先配置并测试了所有数据链路并且工作完美。

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

最佳答案

您可以使用dynamic SQL来做到这一点通过执行匿名 PL/SQL block 。

下面是一个简单的示例,我在其中执行 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>

关于oracle - 接收数据库链接名称作为 Oracle PLSQL 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21094182/

相关文章:

java - 针对 Oracle AND Postgres 的 Java 应用程序

sql - to_number Oracle SQL 中数字格式的动态长度

mysql - 如何选择几个硬编码的 SQL 行?

plsql - PLS-00653 空行错误(PL/SQL 范围内不允许聚合/表函数)

oracle - 将变量分配给 PL/SQL block 内的子查询结果

c# - 在oracle中使用 "nested"事务

c# - 将 System.Data.OracleClient 替换为 Oracle.DataAccess (ODP.NET)

oracle - 在 alter table 中创建约束而不检查现有数据

sql - Oracle/Toad 期望什么日期格式?

oracle - PIVOT,如何将非指定行转换为列?