我在 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”?
答案 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
块中创建全名。