【问题标题】:PLSQL - Create DBLink inside functionPLSQL - 在函数内创建 DBLink
【发布时间】:2014-10-22 20:20:46
【问题描述】:

我想在脚本内创建数据库链接,并希望从链接数据库中接收所有表名。如果我是正确的,我需要创建数据库链接才能使用,但 Oracle 不允许我在 my_fnDECLARE 部分内创建这样的东西。有什么建议吗?

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']';

【问题讨论】:

  • 定义“不走运”。你有错误吗?如果是这样,什么错误?如果您在 PL/SQL 块中动态创建数据库链接,则对该数据库链接的每个引用也需要使用动态 SQL,否则您的块将无法编译。您的SELECT 语句也需要使用EXECUTE IMMEDIATE。退后一步,在运行时创建数据库链接通常是一种糟糕的做法——我会认真质疑你为什么要走这条路。
  • @JustinCave 对 select 语句使用动态 SQL 效果很好!谢谢!您为什么不将此作为答案发布,以便我将其标记为正确答案。

标签: oracle plsql dblink database-link


【解决方案1】:

如果您在 PL/SQL 块中动态创建数据库链接,则对该数据库链接的每个引用也需要使用动态 SQL,否则您的块将无法编译。您的 SELECT 语句也需要使用 EXECUTE IMMEDIATE。退后一步,在运行时创建数据库链接通常是一种糟糕的做法——我会认真质疑你为什么要走这条路。

根据贾斯汀凯夫的评论

【讨论】:

    【解决方案2】:

    确保定义器模式被授予“创建数据库链接”权限。

    这个正在工作:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多