Oracle_FDW 使用介绍
本文以例子的形式介绍 KingbaseES(Postgresql)数据库如何通过 oracle_fdw 扩展访问Oracle数据库。以下例子在PG12.3 与 KingbaseES V8R6进行过实际验证。
一、准备数据
1、Oracle端
IP:192.168.237.42, SID:SOGG ,数据库用户:user01 / user01
SQL> create table t1(id integer,name char(9));
2、KingbaseES 端
IP:192.168.237.43
create role user_ora with login password 'user_ora';
create schema user_ora authorization user_ora;
二、安装配置
1、安装fdw
将官方提供的oracle_fdw包解压,将解压后相关的文件拷贝到对应的 share , lib 目录。注意:要确认安装包是否包含 libclntsh.so 文件,如果没有,需要从oracle 安装路径拷贝,或者安装instantclient。
2、创建扩展
oracle_fdw 包安装后,查 sys_available_extensions 可以看到 oracle_fdw extension。
1 2 3 4 | create extension oracle_fdw; create server to_ora42 foreign data wrapper oracle_fdw options(dbserver '//192.168.237.42:1521/SOGG' ); grant usage on foreign server to_ora42 to user_ora; create user mapping for user_ora server to_ora42 options( user 'user01' , password 'user01' ); |
server与mapping 创建后,在pg_foreign_server 和pg_user_mappings 会有相应条目
1 2 3 4 5 6 7 8 9 10 | test=# select * from pg_foreign_server where srvname= 'to_ora42' ; oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions -------+----------+----------+--------+---------+------------+--------+--------------------------------------- 16552 | to_ora42 | 10 | 16549 | | | | {dbserver=//192.168.237.42:1521/SOGG} test=# select * from pg_user_mappings where srvname= 'to_ora42' ; umid | srvid | srvname | umuser | usename | umoptions -------+-------+----------+--------+----------+------------------------------- 16553 | 16552 | to_ora42 | 16550 | user_ora | { user =user01, password =user01} (1 row) |
3、外部表
1 | create foreign table ft_t1(id integer , name char (9)) server to_ora42 options( schema 'USER01' , table 'T1' ); |
注意:这里的 'USER01' 和 'T1' 都是大写的,与Oracle 数据字典的信息大小写一致。否则在访问时会有如下问题:
1 2 3 4 5 6 | test=> create foreign table ft_t1(id integer , name char (9)) server to_ora42 options( schema 'USER01' , table 't1' ); CREATE FOREIGN TABLE test=> select * from ft_t1; ERROR: Oracle table "USER01" . "t1" for foreign table "ft_t1" does not exist or does not allow read access DETAIL: ORA-00942: table or view does not exist HINT: Oracle table names are case sensitive (normally all uppercase). |
三、可以手动创建wrapper
create extension 后,pg_foreign_data_wrapper 默认就有 oracle_fdw , fdwoptions 为空。默认的wrapper 可能不能使用,可以新建wrapper,在 fdwoptions 可以指定些选项,比如字符集。
1 | create foreign data wrapper oracle_fdw_1 handler oracle_fdw_handler validator oracle_fdw_validator options (nls_lang 'AMERICAN_AMERICA.ZHS16GBK' ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!