在 Oracle 数据库的生态系统中,“打开数据库连接”这个概念根据上下文有不同的理解,对于初学者而言,这通常指通过客户端工具登录数据库;而对于高级开发者,它可能意味着在 PL/SQL 代码块中与另一个数据库实例建立通信,本文将系统地阐述在不同场景下实现 PL/SQL 数据库连接的多种方法,从基础的客户端工具使用到高级的数据库链接技术。

通过客户端工具建立连接
这是最常见、最直接的方式,PL/SQL 代码本身并不能独立“打开”一个连接,它必须运行在一个已经建立的数据库会话之上,这个会话正是通过客户端工具创建的。
*使用 SQLPlus 命令行工具**
SQL*Plus 是 Oracle 提供的经典的命令行界面,轻量且功能强大,通过它连接数据库,核心是 CONNECT 命令(可缩写为 CONN)。
其基本语法结构如下:
CONN[ECT] username/password[@database_identifier]
username: 你的数据库用户名。password: 对应的密码。@database_identifier: (可选)指定要连接的数据库,如果省略,将连接到本地环境默认的数据库,这个标识符可以是多种形式:- TNS 别名:在你的
tnsnames.ora文件中预定义的网络服务名,CONN hr/hr@orclpdb。 - EZCONNECT 语法:一种简便的连接字符串,无需
tnsnames.ora配置,格式为[host][:port][/service_name],CONN hr/hr@192.168.1.100:1521/orclpdb。
- TNS 别名:在你的
当你成功执行该命令后,SQL*Plus 会显示“Connected.”的提示,此时一个数据库会话已经建立,你就可以开始执行 PL/SQL 块或 SQL 语句了。
使用图形化 IDE (如 PL/SQL Developer, SQL Developer)
现代开发者更多地使用集成开发环境(IDE),它们提供了直观的图形化连接界面,尽管不同产品的界面略有差异,但核心步骤基本一致。
- 启动应用程序(如 PL/SQL Developer)。
- 在主界面找到“连接”或类似的按钮(通常是一个数据库图标或“File” -> “New” -> “Database Connection”)。
- 在弹出的对话框中填写连接信息。
下表列出了一个典型连接对话框中关键字段及其对应的 SQL*Plus 概念:
| GUI 字段 | 含义 | 对应 SQL*Plus 元素 |
|---|---|---|
| Username | 数据库用户名 | username |
| Password | 用户密码 | password |
| Database / Host | 数据库标识符或主机地址 | @database_identifier 中的主机部分 |
| Port | 数据库监听端口号 | @database_identifier 中的端口部分 |
| SID / Service Name | 数据库实例名或服务名 | @database_identifier 中的服务名部分 |
填写完所有必要信息后,点击“确定”或“连接”按钮,如果凭证正确且网络可达,IDE 底部状态栏会显示连接成功,并打开一个新的 SQL 窗口,这个窗口就代表了一个活动的数据库会话,你可以在其中自由地编写和运行 PL/SQL 代码。

在 PL/SQL 代码中实现远程连接
业务逻辑需要在一个 PL/SQL 程序单元(如存储过程或函数)中访问另一个远程 Oracle 数据库的数据,不能像客户端工具那样直接“登录”,而是需要使用 数据库链接。
数据库链接是一个数据库对象,它定义了从一个数据库到另一个数据库的路径,本质上是一个持久的、有方向的连接指针。
创建与使用数据库链接
你需要拥有 CREATE DATABASE LINK 权限,使用 CREATE DATABASE LINK 语句来创建它。
CREATE DATABASE LINK remote_db_link CONNECT TO remote_user IDENTIFIED BY "remote_password" USING 'remote_database_tns_alias';
remote_db_link: 你为这个链接起的名字。CONNECT TO remote_user IDENTIFIED BY "remote_password": 用于登录远程数据库的凭证。USING 'remote_database_tns_alias': 指向远程数据库的连接字符串,通常是 TNS 别名。
创建成功后,在 PL/SQL 代码中访问远程对象就变得非常简单,只需在表名或视图名后附加 @db_link_name 即可。
DECLARE
v_employee_name VARCHAR2(100);
BEGIN
-- 从远程数据库的 employees 表中查询数据
SELECT first_name || ' ' || last_name
INTO v_employee_name
FROM employees@remote_db_link
WHERE employee_id = 101;
DBMS_OUTPUT.PUT_LINE('Remote Employee Name: ' || v_employee_name);
END;
/
当这段 PL/SQL 代码执行时,Oracle 数据库会自动通过 remote_db_link 建立与远程数据库的连接,执行查询,然后将结果返回给当前会话,这个过程对开发者是透明的。
“PL/SQL 怎么打开数据库连接”的答案取决于你的具体需求:
- 为了执行代码:使用 SQL*Plus 或图形化 IDE 等客户端工具登录,创建一个会话。
- 为了在代码中访问远程数据:使用
CREATE DATABASE LINK创建一个数据库链接对象,然后在查询中引用它。
理解这两种场景的区别是掌握 Oracle 数据库连接机制的关键,前者是建立工作环境,后者是实现跨数据库通信的桥梁。

相关问答 FAQs
*问题1:我使用 SQLPlus 连接时,提示 “ORA-12154: TNS: 无法解析指定的连接标识符”,这是什么意思?该如何解决?**
解答: 这个错误意味着 Oracle 客户端无法将你提供的连接标识符(orclpdb)解析为一个具体的网络地址,这通常由以下几种原因造成:
tnsnames.ora文件问题:该文件中确实没有定义你使用的别名,或者文件格式有误(如缺少括号、缩进错误)。TNS_ADMIN环境变量未设置或设置错误:Oracle 客户端不知道去哪里寻找tnsnames.ora文件,请确保该环境变量指向了包含正确配置文件的目录。- 使用 EZCONNECT 语法时参数错误:请检查主机名、端口号和服务名是否正确无误。
解决方法是首先检查
tnsnames.ora文件的内容和位置,确保它被正确配置且能被客户端找到,如果使用 EZCONNECT,请仔细核对连接字符串的每一个部分。
问题2:数据库链接和客户端连接有什么本质区别?
解答: 它们的区别主要体现在作用域和管理方式上。
- 客户端连接:是由用户在客户端机器上发起的,用于建立一个交互式会话,这个连接的生命周期与客户端工具的运行时间绑定,主要用于执行 ad-hoc 查询和脚本。
- 数据库链接:是一个定义在数据库服务器内部的数据库对象,它本身不是一个持久开放的连接,而是一个“按需连接”的指针,只有当 PL/SQL 代码实际访问
@db_link对象时,数据库服务器才会去建立与远程服务器的连接,并且这个连接通常会被会话缓存以供后续重用,它的作用是让服务器端的代码能够透明地访问远程数据,而不是为了用户的直接交互。