Oracle-dblink查看、创建、删除与java实际例子

目录

一、含义 

三、dblink权限

 四、创建dblink连接

 五、删除dblink连接

六、使用dblink连接

七、Java实际例子


一、含义 

dblink(Database Link)数据库链接顾名思义就是数据库的链接 ,就像电话线一样,是一个通道,当我们要在本地数据库,跨库访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。

执行以下sql可得当前数据库创建的所有dblink连接

select * from dba_db_links;

OWNER解释

Owner描述
Private私有在本地数据库的特定的schema下建立的databaselink。只有建立该databaselink的schema的用户能使用这个databaselink来访问远程的数据库。同时也只有Owner能删除它自己创建的私有dblink。
Public公有Public的databaselink是数据库级的,本地数据库中所有的拥有数据库访问权限的用户或pl/sql程序都能使用此databaselink来访问相应的远程数据库。
GlobalGlobal的database link是网络级的,When an Oracle network uses a directory server, the directory server automatically create and manages global database links (as net service names) for every Oracle Database in the network. Users and PL/SQL subprograms in any database can use a global link to access objects in the corresponding remote database.
  Note: In earlier releases of Oracle Database, a global database link referred to a database link that was registered with an Oracle Names server. The use of an Oracle Names server has been deprecated. In this document, global database links refer to the use of net service names from the directory server.

一句话:私有dblink连接只有创建者用户可使用,公有dblink连接当前数据库用户都可使用

三、dblink权限

创建数据库链接的帐号必须有以下系统权限

权限解释
CREATE DATABASE LINK创建私有dblink连接
CREATE PUBLIC DATABASE LINK创建公有dblink连接
CREATE SESSION

远程登录数据库

查询用户(RUOYI)是否拥有创建dblink权限,执行以下sql

select * from user_sys_privs where privilege like upper('%DATABASE LINK%')
 AND USERNAME='RUOYI'

若返回结果如图,则表示该用户拥有表示具备创建(公有和私有)database link权限

若是返回为空,则表示该用户没有创建dblink权限

在sys用户下,把CREATE PUBLIC DATABASE LINKDROP PUBLIC DATABASELINK(删除dblink连接)权限授予给你的用户:

grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to RUOYI;

再执行上面查看是否具备权限的sql语句,会得到如图所示,则该用户拥有创建公有、私有、删除dnlink连接权限

 四、创建dblink连接

以创建公有dblink连接为例

根据oracle-listener.ora文件得到

数据库的ssid=DMSF3201

HOST=6.1.144.99

create public database link dblink名称
connect to 用户名 identified by "密码"
  using '(DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 数据库的ip地址 )(PORT = 1521))
  )
  (CONNECT_DATA =
  (SERVICE_NAME = 数据库的ssid)
  )
  )';

 五、删除dblink连接

  DROP PUBLIC DATABASE LINK dblink名称;

六、使用dblink连接

SELECT …… FROM 表名@数据库dblink链接名;

七、Java实际例子

本地数据库:IP:6.1.144.98 账号:RUOYI 密码:RUOYI

远程数据库:IP:6.1.144.99 账号:RUOYI 密码:RUOYI

本地数据库未执行以下程序

查询dblink如图

 执行以下程序



import com.alibaba.druid.pool.DruidDataSource;
import com.maxvision.duty.exception.DutyRuntimeException;
import org.apache.ibatis.jdbc.SqlRunner;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;

public class Test {
    public Connection getJdbcConnection(String url, String username, String pwd) throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(pwd);
        druidDataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        druidDataSource.setMaxWait(30000);
        druidDataSource.setMaxActive(2000);
        druidDataSource.setMinIdle(5);
        druidDataSource.setRemoveAbandoned(false);
        druidDataSource.setRemoveAbandonedTimeout(4000);
        druidDataSource.setLogAbandoned(true);
        druidDataSource.setTestOnBorrow(true);
        druidDataSource.setTestOnReturn(true);
        druidDataSource.setTestWhileIdle(true);
        druidDataSource.setMinEvictableIdleTimeMillis(180000);
        druidDataSource.setInitialSize(10);
        druidDataSource.setTimeBetweenEvictionRunsMillis(60000);
        druidDataSource.setBreakAfterAcquireFailure(true);
        druidDataSource.setConnectionErrorRetryAttempts(5);
        druidDataSource.setTimeBetweenConnectErrorMillis(5);
        druidDataSource.setValidationQuery("SELECT 1 FROM SYS.DUAL");
        return druidDataSource.getConnection();
    }

    /**
     * 创建数据库dblink
     *
     * @param dbLinkName
     * @param account    dblink用户名
     * @param pwd        dblink密码
     * @param dsName
     * @param ip
     */
    public void createDBLink(String dbLinkName, String url, String account, String pwd, String dsName, String ip) {
        try (Connection conn = getJdbcConnection(url, account, pwd)) {
            final SqlRunner runner = new SqlRunner(conn);
            StringBuilder stringBuilder = new StringBuilder();
            //查看数据库是否存在dblink
            Map<String, Object> maps = runner.selectOne(stringBuilder.append("select COUNT(*) count from dba_db_links WHERE DB_LINK = '").append(dbLinkName).append("'").toString());
            if (Integer.parseInt(maps.get("COUNT").toString()) > 0) {
                //数据库存在dblink
                return;
            }
            stringBuilder = new StringBuilder();
            stringBuilder.append("create public database link ");
            stringBuilder.append(dbLinkName);
            stringBuilder.append(" connect to ");
            stringBuilder.append(account).append(" identified by ");
            stringBuilder.append("\"").append(pwd).append("\"").append(" using ");
            stringBuilder.append("'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = ").append(ip);
            stringBuilder.append(")(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = ").append(dsName).append(")))'");
            runner.run(stringBuilder.toString());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //本地数据库和远程数据库测试方便, 账号密码都是一样 RUOYI
        Test test = new Test();
        //本地数据库
        String sourceUrl = "jdbc:oracle:thin:@6.1.144.98:1521:DMSF3201";
        //远程数据库
        String targetUrl = "jdbc:oracle:thin:@6.1.144.99:1521:DMSF3201";
        //远程数据库获取sid(DMSF3201)
        String dsName = targetUrl.split("@")[1].split(":")[2];
        String account = "RUOYI";
        String pwd = "RUOYI";
        String dbLinkName = "TestDblink";
        //远程数据库IP
        String ip = "6.1.144.99";
        //创建数据库dblink
        test.createDBLink(dbLinkName, sourceUrl, account, pwd, dsName, ip);
    }
}

运行后,查询数据库

 接着在本地数据库(98)中执行查询远程数据库(99)表记录

SELECT …… FROM 表名@数据库dblink链接名;

 参考地址:https://baike.baidu.com/item/dblink/15079163?fr=aladdin

                  https://www.cnblogs.com/wangyong/p/6354528.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在数据库中,dblink是一种用于在不同数据库之间建立连接的扩展。通过使用dblink,您可以在一个数据库中访问另一个数据库中的表和数据。要查看dblink的信息和使用方法,您可以按照以下步骤进行操作: 1. 确认dblink扩展已经安装:首先,您需要确认dblink扩展已经在您的数据库中安装和启用。您可以使用以下SQL查询来检查是否已经安装了dblink扩展: ``` SELECT * FROM pg_extension WHERE extname = 'dblink'; ``` 如果查询结果为空,则表示dblink扩展未安装。您可以通过执行以下SQL语句来安装dblink扩展: ``` CREATE EXTENSION dblink; ``` 2. 查看dblink函数:一旦确认dblink扩展已经安装,您可以使用以下SQL查询来查看可用的dblink函数: ``` SELECT proname, proargtypes FROM pg_proc WHERE proname LIKE 'dblink%'; ``` 这将返回所有以"dblink"开头的函数名称和参数类型。 3. 使用dblink函数:根据您的需求,您可以使用不同的dblink函数来建立连接、执行查询、获取结果等。以下是一些常用的dblink函数示例: - dblink_connect:用于建立到目标数据库的连接。 - dblink_exec:用于在目标数据库上执行SQL语句。 - dblink_fetch:用于获取执行结果。 - dblink_disconnect:用于关闭与目标数据库的连接。 请注意,具体的dblink函数使用方法和参数可能会根据您所使用的数据库系统而有所不同。建议您查阅相关数据库的官方文档或参考手册,以获取更详细和准确的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值