我想在脚本中创建数据库链接,并希望从链接数据库中接收所有表名。如果我是正确的,我需要创建数据库链接才能使用,但Oracle不允许我在 my_fn 或 DECLARE 部分内创建此类内容。有什么建议吗?
DECLARE
TYPE tp_col_array IS TABLE OF varchar2(1000);
FUNCTION my_fn(
p_in_dblink_name IN VARCHAR2,
p_in_schema_name IN VARCHAR2)
RETURN varchar2 AS
vr_coll_table tp_col_array;
vr_coll_owner tp_col_array;
BEGIN
create database link "database1"
connect to my_name
identified by "my_password"
using 'database1';
SELECT owner, table_name
bulk collect into vr_coll_owner, vr_coll_table
FROM all_tables@database1
WHERE OWNER NOT IN ('SYS');
RETURN TO_CHAR(vr_coll_owner(1)); //just for temporary
END my_fn;
BEGIN
DBMS_OUTPUT.PUT_LINE(my_fn('link1','schema1'));
END;
的 修改 的 我也试过以下,但没有运气:(
Execute immediate q'[create database link "database1"
connect to my_name
identified by "my_password"
using 'database1']';
答案 0 :(得分:0)
如果在PL / SQL块中动态创建数据库链接,则对该数据库链接的每次引用都需要使用动态SQL,否则您的块将无法编译。您的SELECT语句也需要使用EXECUTE IMMEDIATE。退一步,在运行时创建数据库链接通常是一种不好的做法 - 我会严重质疑你为什么要走这条路。
根据Justin Cave的评论
答案 1 :(得分:-1)
确保definer-schema被授予“create database link”权限。
这个正在运作:
me@XE> execute execute immediate 'create database link superlink connect to a identified by b using ''TNSALIAS''';
PL/SQL procedure successfully completed.
me@XE> @mylinks
DB_LINK USERNAME PASSWORD HOST CREATED
--------------- --------------- --------------- ------------------------- --------------------
SUPERLINK A TNSALIAS 22.10.2014 22:42:19