Oracle_关联查询

1、

等值连接(Equijoin)、非等值连接(Non-Equijoin)、外连接(Outer join):-->左外连接-->右外连接、自连接(Self join)

交叉连接(Cross join)、自然连接(Natural join)、使用Using子句建立连接、使用on子句建立连接、外连接(Outer join):-->左外连接-->右外连接-->全外连接

2、

等值连接(Equijoin)

 select empno,ename,sal,emp.deptno,dname from emp,dept where emp.deptno = dept.deptno;

 可使用AND操作符增加查询条件

  • 使用表别名可以简化查询
  • 使用表名(表别名)前缀可提高查询效率
  • 为了连接n个表,至少需要n-1个连接条件

 非等值连接(Non-Equijoin)

外连接(Outer join):使用外连接可以看到参与连接的某一方不满足连接条件的记录,外连接运算符为(+),传统的外连接分为左外连接和右外连接两种。

自连接(Self join)

交叉连接(Cross join):Cross join 产生了一个笛卡尔集,其效果等同于再两个表进行连接时未使用where子句限定连接条件

自然连接(Natural join):Natural join基于两个表中的全部同名列建立连接

  • 从两个表中选出同名列的值均对应相等的所有行
  • 如果两个表中的同名列的所有数据类型不同,则出错
  • 不允许在参照列上使用表名或者别名作为前缀
  • Using子句:如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名

  • On子句:如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用On子句

内连接(Inner join):内连接只返回满足连接条件的数据

左外连接(Left Outer Join):两个表在连接过程中除返回满足连接条件的行为外,还返回左表中不满足条件的行为,这种连接称为左外连接.

右外连接(Right Outer Join):两个表在连接过程中除返回满足连接条件的行为外,还返回右表中不满足条件的行为,这种连接称为右外连接.

 

转载于:https://www.cnblogs.com/caroline4lc/p/3888178.html

<think>我们正在回答用户的问题:如何在PostgreSQL中配置和使用oracle_fdw来查询Oracle数据库 根据引用内容,特别是引用[1][2][3][4]中关于oracle_fdw的安装、配置和使用方法,我们将步骤详细说明如下: 注意:这里将分为Linux和Windows两个平台的安装,因为引用[2]提供了Windows的详细步骤,引用[1][4]提供了Linux的步骤。 步骤概览: 1. 安装前提(Oracle客户端库) 2. 安装oracle_fdw扩展 3. 创建外部服务器 4. 创建用户映射 5. 创建外部表 6. 查询外部表 下面分别详细说明: ### 一、安装前提 在安装oracle_fdw之前,必须确保PostgreSQL服务器能够访问Oracle客户端库(OCI)。这通常需要安装Oracle Instant Client或完整Oracle客户端。 - **Linux环境**(参考引用[1][4]): 1. 下载Oracle Instant Client(Basic和SDK包)[^1]。 2. 解压到某个目录,例如:`/opt/oracle/instantclient_19_10`。 3. 设置环境变量: ```bash export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_10:$LD_LIBRARY_PATH ``` 4. 确保PostgreSQL服务启动时能加载这个环境变量(可以将其添加到服务启动脚本中)。 - **Windows环境**(参考引用[2]): 1. 下载Oracle Instant Client(Basic和SDK包)[^2]。 2. 解压到某个目录,例如:`C:\instantclient_19_10`。 3. 将该目录添加到系统环境变量`PATH`中。 ### 二、安装oracle_fdw扩展 根据操作系统不同,安装方式略有不同。 - **Linux环境**(编译安装,参考引用[4]): ```bash # 进入PostgreSQL源码目录下的contrib/oracle_fdw cd <postgresql源码目录>/contrib/oracle_fdw make sudo make install ``` 然后,在PostgreSQL中创建扩展: ```sql CREATE EXTENSION oracle_fdw; ``` - **Windows环境**(直接复制文件,参考引用[2]): 1. 下载预编译的oracle_fdw插件包(包含dll和sql文件)[^2]。 2. 将`oracle_fdw.dll`复制到PostgreSQL安装目录的`lib`子目录。 3. 将`share/extension`目录下的四个文件(`oracle_fdw.control`, `oracle_fdw--1.1.sql`, `oracle_fdw--1.0--1.1.sql`)复制到PostgreSQL安装目录的`share/extension`子目录。 4. 在PostgreSQL中创建扩展: ```sql CREATE EXTENSION oracle_fdw; ``` ### 三、创建外部服务器 在PostgreSQL中创建一个外部服务器对象,指向Oracle数据库实例。 ```sql CREATE SERVER oracle_server FOREIGN DATA WRAPPER oracle_fdw OPTIONS ( dbserver '//oracle_host:1521/oracle_service_name' -- Oracle数据库的连接字符串 ); ``` 注意:`dbserver`的格式通常是`//主机名:端口/服务名`。 ### 四、创建用户映射 创建用户映射,指定连接Oracle数据库的用户名和密码。 ```sql CREATE USER MAPPING FOR local_pg_user -- 本地PostgreSQL用户 SERVER oracle_server OPTIONS ( user 'oracle_username', password 'oracle_password' ); ``` ### 五、创建外部表 在PostgreSQL中创建外部表,映射到Oracle中的表。 ```sql CREATE FOREIGN TABLE pg_oracle_table ( id integer OPTIONS (key 'yes') NOT NULL, -- 可选:指定主键(用于更新操作) name text, age integer, salary numeric(10,2) ) SERVER oracle_server OPTIONS ( schema 'ORACLE_SCHEMA', -- Oracle中的模式名(大写) table 'ORACLE_TABLE' -- Oracle中的表名(大写) ); ``` 注意: - 数据类型需要映射正确(可参考oracle_fdw文档)。 - 表名和模式名在Oracle中通常是大写,如果创建时用了引号则按实际大小写。 ### 六、查询外部表 现在可以像查询普通表一样查询外部表: ```sql SELECT * FROM pg_oracle_table WHERE age > 30; ``` ### 七、高级配置(可选) - **批量获取**:可以在创建外部表时设置`fetch_size`选项,例如:`OPTIONS (fetch_size '500')`,以优化性能。 - **只读操作**:默认情况下,外部表支持SELECT、INSERT、UPDATE和DELETE(需要Oracle中的主键或唯一索引)。如果只需要查询,可以设置`readonly 'true'`。 ### 八、权限管理 如果需要让其他用户使用外部表,需要授权: ```sql GRANT USAGE ON FOREIGN SERVER oracle_server TO other_user; GRANT SELECT ON pg_oracle_table TO other_user; ``` ### 常见问题解决 1. **连接错误**:确保环境变量(`LD_LIBRARY_PATH`或`PATH`)设置正确,并且PostgreSQL服务重启后生效。 2. **Oracle客户端版本**:建议使用与Oracle服务器版本兼容的客户端版本(例如,12.2以上)。 3. **字符集问题**:确保PostgreSQL和Oracle数据库的字符集兼容(建议都使用UTF-8)。 通过以上步骤,就可以在PostgreSQL中通过oracle_fdw查询Oracle数据库了。 参考文献: [^1]: oracle_fdw 是 PostgreSQL 的一个外部数据包装器(Foreign Data Wrapper)扩展,允许 PostgreSQL 直接连接和操作 Oracle 数据库。以下是全面详细的使用指南: 一、安装与配置 1. 前置要求 [^2]: Windows下安装oracle_fdw:从PostgreSQL中访问Oracle数据库。 [^3]: PostgreSQL数据库插件fdw使用心得—mysql_fdw、oracle_fdw、postgresql_fdw。 [^4]: PostgreSQL中使用oracle_fdw访问Oracle数据库。然后进入到oracle_fdw源码目录进行编译安装: #用和pg编译安装同一个用户登录 cd <postgresql源码目录>/contrib/oracle_fdw make make insttall §§相关问题§§ 1. 在Linux下如何配置Oracle Instant Client的环境变量使其对PostgreSQL永久生效? 2. 创建外部表时如何映射Oracle中的DATE和TIMESTAMP类型? 3. 如何通过oracle_fdw执行INSERT、UPDATE和DELETE操作? 4. oracle_fdw支持哪些Oracle版本?</think>### 在 PostgreSQL 中使用 oracle_fdw 查询 Oracle 数据库的完整指南 以下是分步配置和使用 oracle_fdw 扩展的详细流程: --- #### 🛠 一、安装 oracle_fdw 扩展 **前提条件**: 1. 安装 Oracle Instant Client(Basic 和 SDK 包) 2. 配置环境变量: ```bash # Linux export LD_LIBRARY_PATH=/path/to/instantclient:$LD_LIBRARY_PATH # Windows 添加 Instant Client 路径到系统 PATH 变量 ``` **安装步骤**: 1. **Linux 编译安装**: ```bash cd <postgresql源码目录>/contrib/oracle_fdw make sudo make install # 需与 PostgreSQL 编译用户相同[^4] ``` 2. **Windows 安装**: - 下载预编译包(含 oracle_fdw.dll) - 复制文件到 PostgreSQL 目录: - `oracle_fdw.dll` → `PostgreSQL\lib` - 扩展文件 → `PostgreSQL\share\extension`[^2] 3. **创建扩展**: ```sql CREATE EXTENSION oracle_fdw; -- 需超级用户执行[^2] ``` --- #### 🔌 二、配置 Oracle 连接 1. **创建外部服务器**: ```sql CREATE SERVER oracle_server FOREIGN DATA WRAPPER oracle_fdw OPTIONS ( dbserver '//oracle_host:1521/ORCL' -- Oracle 连接字符串 ); ``` 2. **创建用户映射**: ```sql CREATE USER MAPPING FOR postgres_user -- 本地 PG 用户 SERVER oracle_server OPTIONS ( user 'oracle_user', password 'oracle_password' ); ``` 3. **授权普通用户**: ```sql GRANT USAGE ON FOREIGN SERVER oracle_server TO app_user; -- 授权普通用户[^2] ``` --- #### 🗂 三、创建外部表 1. **Oracle 表结构**: ```sql CREATE TABLE oracle_users ( id NUMBER(10) PRIMARY KEY, name VARCHAR2(50), created_date DATE ); ``` 2. **PostgreSQL 外部表**: ```sql CREATE FOREIGN TABLE pg_oracle_users ( id INTEGER OPTIONS (key 'true') NOT NULL, -- 映射主键 name TEXT, created_date TIMESTAMP -- Oracle DATE → PG TIMESTAMP ) SERVER oracle_server OPTIONS ( schema 'ORACLE_SCHEMA', table 'ORACLE_USERS', fetch_size '500' -- 批量获取优化 ); ``` --- #### 🔍 四、执行跨库查询 1. **基本查询**: ```sql SELECT * FROM pg_oracle_users WHERE created_date > '2023-01-01'; ``` 2. **关联本地表**: ```sql SELECT local.id, o.name, local.email FROM local_users local JOIN pg_oracle_users o ON local.oracle_id = o.id; ``` 3. **聚合查询**: ```sql SELECT EXTRACT(YEAR FROM created_date) AS year, COUNT(*) FROM pg_oracle_users GROUP BY year; ``` --- #### ⚙️ 五、高级配置 1. **数据类型映射**: | Oracle 类型 | PostgreSQL 类型 | |-------------------|----------------| | `NUMBER` | `NUMERIC` | | `VARCHAR2` | `TEXT` | | `DATE` | `TIMESTAMP` | | `CLOB` | `TEXT` | 2. **性能优化**: ```sql CREATE FOREIGN TABLE ... OPTIONS ( fetch_size '1000', -- 增加批量获取行数 readonly 'true' -- 只读模式提升性能 ); ``` 3. **事务控制**: ```sql SET oracle_fdw.isolation_level = 'serializable'; -- 设置事务隔离级别 ``` --- #### ⚠️ 常见问题解决 1. **连接失败**: - 检查 `LD_LIBRARY_PATH`/`PATH` 是否包含 Instant Client - 验证 Oracle 监听端口(默认 1521)可访问 - 确认 Oracle 用户权限 2. **数据类型错误**: ```sql -- 显式类型转换示例 SELECT id, name::VARCHAR(100) FROM pg_oracle_users; ``` 3. **权限不足**: ```sql ALTER USER MAPPING FOR postgres_user SERVER oracle_server OPTIONS (SET user 'admin_user'); -- 切换高权限用户[^2] ``` --- #### 📊 两种方案对比 | **场景** | **推荐方案** | |------------------|-------------------| | 高频查询 | `oracle_fdw` 外部表 | | 临时数据抽取 | `dblink` 函数 | | 数据同步 | `oracle_fdw` + 物化视图 | | 简单单次查询 | `dblink` | --- 💡 **应用场景示例**: 将 Oracle 订单数据与 PostgreSQL 用户表关联分析: ```sql SELECT u.user_name, SUM(o.amount) AS total_spent FROM postgres_users u JOIN pg_oracle_orders o ON u.oracle_id = o.customer_id WHERE o.order_date BETWEEN '2023-01-01' AND '2023-12-31' GROUP BY u.user_name ORDER BY total_spent DESC; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值