资讯详情

DbGate Oracle 连接插件(dbgate-plugin-oracle)使用指南:安装、环境配置与连接原理

📅 2026/10/15 16:05:12 | 华诺云谱 👁 阅读
DbGate Oracle 连接插件(dbgate-plugin-oracle)使用指南:安装、环境配置与连接原理
数据库数据库客户端桌面应用后端【免费下载链接】dbgateDatabase manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under Windows, Linux, Mac or as web application项目地址https://gitcode.com/gh_mirrors/db/dbgate点击查看免费下载本文以 DbGate 仓库中 dbgate-plugin-oracle 插件为对象介绍如何在 DbGate 中安装并连接 Oracle 数据库重点解读插件文档中通过 DbGate 安装设置 NODE_OPTIONS--openssl-legacy-provider以及将 pg.client / pg.query 映射到 oracledb三条核心说明背后的真实含义。读者读完本文后将能正确完成 Oracle 插件的安装与环境配置理解 Thin / Thick 两种连接模式的区别并掌握该插件在连接、SQL 执行、批量写入、数据库结构分析等环节的底层实现便于自行排查连接问题或二次开发。插件是什么dbgate-plugin-oracle是 DbGate一个支持 MySQL、PostgreSQL、SQL Server、MongoDB、SQLite 等多种数据库的桌面与 Web 数据库管理工具的官方内置 Oracle 连接插件。它在 package.json 中被标记为dbgatebuiltin说明该插件随 DbGate 主仓库一起维护负责提供 Oracle 数据库的引擎驱动、连接配置表单、SQL 方言定义、结构分析Analyser与 SQL 导出Dumper能力。从源码结构看插件分为两大部分srcsrc/backend后端驱动运行在 Node.js 进程内负责建立连接、执行查询、流式读取、批量写入以及通过sql/目录下的一组 SQL 模板完成表结构、主键、外键、索引、视图、物化视图、存储过程、函数、触发器等的元数据分析src/frontend前端驱动运行在浏览器/渲染进程中负责定义连接表单显示规则、SQL 方言dialect、SQL 导出器Dumper以及插件图标。前端与后端通过index.js分别导出{ packageName, drivers }结构见 backend/index.js 与 frontend/index.js这是 DbGate 插件体系约定的标准入口。安装方式插件 README 的第一句即指明Use DbGate for install of this plugin通过 DbGate 安装此插件。也就是说安装本插件不需要手工 clone 仓库或编译源码标准做法是在 DbGate 应用内完成打开 DbGate进入插件管理界面DbGate 提供内置的插件市场/插件管理入口搜索dbgate-plugin-oracle并安装启用在新建连接中选择 Oracle 引擎填写连接参数。安装完成后插件通过 webpack 分别构建出后端与前端产物dist/backend.js、dist/frontend.js构建脚本见 package.json 的build命令对应 webpack-backend.config.jstarget 为node与 webpack-frontend.config.jstarget 为web。其中后端构建会把dependencies与optionalDependencies声明为 externals见 common/buildPluginExternals.js这意味着oracledb等依赖在运行期由宿主环境按需加载。提示由于仓库是只读的若需在本地开发或调试该插件只能执行构建、运行与查看源码不应直接修改仓库内容。环境变量 NODE_OPTIONS--openssl-legacy-provider 的由来README 中的第二句set NODE_OPTIONS--openssl-legacy-provider这是插件安装/启动时的一个重要前置条件。该设置同样出现在仓库根目录的 start.bat 中set NODE_OPTIONS--openssl-legacy-provider用于在 Windows 下启动 DbGate 时统一注入此参数。其作用机制如下NODE_OPTIONS是 Node.js 官方支持的环境变量可向 Node.js 进程注入命令行选项--openssl-legacy-provider让 Node.js 启用 OpenSSL 3.0 的legacy provider恢复对旧版加密算法的支持oracledb客户端库尤其在使用 Thick 模式调用 Oracle Instant Client 的场景以及部分依赖在 OpenSSL 3.x 环境下可能使用旧算法若不开启 legacy provider会在运行时抛出类似ERR_OSSL_UNSUPPORTED的不支持的算法错误。因此在 Windows 上启动 DbGate 前应先设置该环境变量否则连接 Oracle 时可能出现 OpenSSL 兼容性错误。在 start.bat 中该变量在启动命令之前被set正是为了保证后续启动的 Node 进程继承此配置。在 macOS/Linux 下可等价使用export NODE_OPTIONS--openssl-legacy-provider将 pg.client / pg.query 映射到 oracledb的含义README 的第三句Map pg.client and pg.query to oracledb这短短一行概括了本插件的驱动实现策略。结合源码可以还原其真实含义DbGate 的 Oracle 插件复用 PostgreSQL 驱动的连接/查询抽象接口将其逐一映射到 node-oracledb 的 API 上。证据在 backend/driver.js 中清晰可见connect()通过oracledb.getConnection({ user, password, connectString })建立连接替代了 PostgreSQL 的pg.Clientquery()通过dbhan.client.execute(sql)执行语句替代了pg.query()流式读取stream()/readQuery()使用dbhan.client.queryStream(sql)并在代码中保留了被注释掉的const query new pg.Query({...})片段直接印证了这一由 pg 改写为 oracledb的映射过程stream()中针对非SELECT语句的execute(sql, callback)分支会解析rowsAffected并上报N rows affected信息行为与 PostgreSQL 驱动保持一致。也就是说插件的核心工作是实现 DbGate 定义的EngineDriver接口而该接口的方法签名与 PostgreSQL 驱动高度一致只需将内部实现换成oracledb即可。这也是 README 用一行注释概括整个驱动设计的原因。连接参数与两种驱动模式插件在 frontend/driver.js 中声明了连接表单的显示规则showConnectionField与默认端口 1521defaultPort。根据showConnectionField的逻辑连接配置分为两类输入方式URL 方式useDatabaseUrl填写databaseUrl占位符示例为e.g. localhost:1521/orcl、user、password字段方式填写server、port、user、password、serviceName其中serviceName还可选择serviceNameType为sid或服务名。connect()见 backend/driver.js对connectString的拼接规则如下配置connectString 形式说明useDatabaseUrl开启直接使用databaseUrl例如localhost:1521/orclserviceNameType sid(DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOSTserver)(PORTport))(CONNECT_DATA(SIDserviceName)))使用完整的描述符语法默认端口 1521其他${server}:${port || 1521}/${serviceName}经典 host:port/service 形式无 serviceName${server}:${port || 1521}仅主机与端口连接成功后若填写了database即目标 Schema驱动会执行ALTER SESSION SET CURRENT_SCHEMA ${database}见 backend/driver.js使会话后续操作默认落到该 Schema 上。插件还支持authTypeDriver mode即驱动模式选择对应两种驱动实现Thin mode默认纯 JavaScript 实现无需安装 Oracle Instant Client直接连接 Oracle 数据库Thick mode通过oracledb.initOracleClient({ libDir: clientLibraryPath || process.env.ORACLE_INSTANT_CLIENT })加载本机的 Oracle Instant Client 库适合需要 Instant Client 才能完成的场景见 backend/driver.js 中getAuthTypes()与connect()的authType thick分支。此外showConnectionTab: field field sshTunnel表明插件支持 SSH 隧道连接readOnlySessions: true、supportsTransactions: true、implicitTransactions: true则说明该驱动支持只读会话并遵循 Oracle 的隐式事务语义每条语句自动提交除非显式开启事务。SQL 方言与数据类型适配Oracle 与 PostgreSQL、MySQL 的 SQL 语法差异较大因此插件在 frontend/driver.js 中定义了完整的dialect对象分页方式rangeSelect: true、rowNumberOverPaging: true、offsetFetchRangeSyntax: true并通过dialectByVersion(version)做版本区分——Oracle 12c 以下版本不支持FETCH FIRST ... ROWS ONLY此时关闭rangeSelect与offsetFetchRangeSyntax改用 ROWNUM/ROW_NUMBER 分页12c 及以上启用标准分页语法标识符引用quoteIdentifier使用双引号并将内部双引号转义为upperCaseAllDbObjectNames: true表示数据库对象名统一按大写处理默认值/自增defaultValueBeforeNullability: true自增列在 Oracle 中通过GENERATED BY DEFAULT ON NULL AS IDENTITY实现用户前缀userDatabaseNamePrefix: C##——对应createDatabase()生成的CREATE USER c##xxx语句见 frontend/Dumper.js预定义数据类型包含VARCHAR2、NUMBER、DATE、CLOB、BLOB、INTEGER、BFILE、BINARY_DOUBLE、BINARY_FLOAT、CHAR、FLOAT、INTERVAL DAY、INTERVAL YEAR、LONG、LONG RAW、NCHAR、NCLOB、NVARCHAR2、RAW、ROWID、TIMESTAMP、UROWID等 Oracle 原生类型类型适配adaptDataType将其他引擎常见的datetime映射为timestamp、text映射为clob、bigint映射为integer空间类型spatialTypes [GEOGRAPHY]当列类型为 GEOGRAPHY 时查询表达式会用ST_AsText(column)包裹以文本形式返回空间数据。数据读写时的类型换算集中在 backend/driver.js连接初始化时设置oracledb.fetchAsString [CLOB, NCLOB]、fetchAsBuffer [BLOB]保证 CLOB/NCLOB 以字符串、BLOB 以 Buffer 返回modifyRow将Date类型转为 ISO 字符串将 Buffer 包装为{ $binary: { base64 } }结构写入时见 backend/driver.js 与 frontend/Dumper.js 的putValuetimestamp类型使用TO_TIMESTAMP(..., YYYY-MM-DDTHH24:MI:SS)date类型使用TO_DATE(...)字节数组使用HEXTORAW(...)二进制/大对象值以十六进制字符串形式插入。查询执行与流式读取query()方法见 backend/driver.js的执行细节对空 SQL 直接返回空结果自动去除末尾分号/^(.*);\s*$/若传入options.commandTimeout会临时设置dbhan.client.callTimeoutOracle 的语句超时机制执行完毕后恢复原值通过client.execute(sql)执行并将res.metaData转换为列信息列名通过makeUniqueColumnNames保证唯一行数据先zipDataRow组装成对象再modifyRow完成类型转换。对于大结果集stream()与readQuery()使用client.queryStream(sql)逐行推送数据metadata事件先输出recordset列头data事件逐行输出end事件收尾并上报影响行数error事件则把错误位置offset换算成 SQL 中的行号lineNumber回传。非SELECT语句走execute回调分支输出rows affected或错误信息。readQuery()额外通过stream.PassThrough({ objectMode: true })构造可读流供 DbGate 的数据导入/导出管道消费。批量写入executeMany 与日期处理针对大量数据的导入插件实现了 createOracleBulkInsertStream.jswriteTable()返回一个基于createBulkInsertStreamBase的 Writable 流其send()方法会把缓冲区中的行一次性提交构造INSERT INTO schema.table (col1, col2, ...) VALUES (:C0, :C1, ...)语句列名经过quoteIdentifier引用对timestamp/date类型的列绑定参数包上CASE WHEN :Ci IS NULL THEN NULL ELSE TO_TIMESTAMP(:Ci, YYYY-MM-DDTHH24:MI:SS) END或TO_DATE保证日期字符串在数据库中按正确类型写入行数据通过_.mapKeys把columnName重命名为c{index}以匹配绑定位置最终调用dbhan.client.executeMany(dmp.s, rows, { autoCommit: true })批量执行并自动提交。这种构造 INSERT executeMany autoCommit的组合是 node-oracledb 官方推荐的批量插入方式性能明显优于逐行execute。数据库结构分析Analyser与元数据 SQL插件内置的 Analyser.js 继承自 DbGate 的DatabaseAnalyser通过_runAnalysis()分阶段加载各类元数据并在界面上输出DBGM-00230 ~ DBGM-00240系列进度消息。每一类元数据对应 src/backend/sql 下的一条 SQL 模板均查询 Oracle 数据字典视图分析项查询视图关键列表列表 tableList.jsall_tablesnum_rows * avg_row_len估算大小、num_rows行数列定义 columns.jsall_tab_columnsnullable、data_type、data_length、data_precision、data_scale、data_default主键 primaryKeys.jsall_constraintsall_cons_columnsconstraint_type P外键 foreignKeys.jsall_constraintsall_cons_columnsconstraint_type R关联ref.table_name索引 indexes.jsall_indexesall_ind_columnsuniqueness、descend唯一约束 uniqueNames.jsall_constraintsconstraint_type U视图 views.jsall_viewstext视图定义物化视图 matviews.jsall_mviews通过dbms_xmlgen.getxmltype提取query定义存储过程/函数 routines.jsall_sourceLISTAGG(text,)拼接源码、ora_hash生成哈希过程参数 parameters.jsall_objectsall_argumentsARGUMENT_NAME、DATA_TYPE、IN_OUT触发器 triggers.jsall_triggersTRIGGER_TYPE、TRIGGERING_EVENT、TRIGGER_BODY这些模板统一使用$owner占位符限定 SchemaAnalyser.createQuery会对$owner做字符串转义并用OBJECT_ID_CONDITION按对象类型过滤。columns.js中order by column_id保证列按定义顺序返回foreignKeys.js中order by basecol.position保证多列外键的列顺序。分析结果经getColumnInfo归一化为统一的列模型字符串列拼出varchar(n)、数字列拼出number(p,s)、default_value以.nextval结尾时判定为自增列autoIncrement并据此推导出identitySequenceName用于selectScopeIdentity生成SELECT seq.CURRVAL FROM DUAL见 frontend/Dumper.js。视图/物化视图/存储过程等的createSql也由该分析器重建存储过程与触发器脚本以SET SQLTERMINATOR /开头、以/结尾适配 Oracle 的 PL/SQL 块终结符。数据库管理与版本识别插件同时提供了数据库级管理能力frontend/Dumper.jscreateDatabase生成CREATE USER c##{name} IDENTIFIED BY {name} DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 10M ON users普通用户需C##前缀dropDatabaseDROP USER {name}changeColumn/renameColumn/renameTable/renameSqlObject分别生成ALTER TABLE ... MODIFY (...)、ALTER TABLE ... RENAME COLUMN ... TO ...、ALTER TABLE ... RENAME TO ...、RENAME ... TO ...createForeignKeyFore按CONSTRAINT ... FOREIGN KEY (...) REFERENCES ... (...) ON DELETE ...输出外键 DDL事务处理beginTransaction()为空实现因为 Oracle 采用隐式事务。版本识别由getVersion()见 backend/driver.js实现优先查询product_component_version中product LIKE Oracle%Database%的行失败则回退查询v$version的banner再通过正则提取主版本号与次版本号用于前端dialectByVersion的分页语法选择以及物化视图支持能力判断9.3 及以上版本启用materializedViews。此外listDatabases通过SELECT username FROM all_users ORDER BY username枚举当前实例中的用户/数据库供连接界面下拉选择。常见问题排查结合上文源码依据可归纳以下排查要点OpenSSL 错误若连接时报ERR_OSSL_UNSUPPORTED确认已设置NODE_OPTIONS--openssl-legacy-providerWindows 见 start.batThick 模式找不到客户端库选择 Thick 模式时必须指定clientLibraryPath或在环境中设置ORACLE_INSTANT_CLIENT且authType字段仅在桌面版platformInfo.isElectron或已设置ORACLE_INSTANT_CLIENT时可选见 backend/driver.js 的getAuthTypes()连接字符串格式不使用 URL 方式时serviceName与serviceNameType的组合决定了 EZConnect 或完整描述符格式端口缺省为 1521若需指定 Schema可在连接后填写database字段触发ALTER SESSION SET CURRENT_SCHEMA字符/大对象显示异常驱动已默认将 CLOB/NCLOB 以字符串、BLOB 以 Base64 二进制结构返回若使用旧版驱动请升级插件版本分页语法差异Oracle 12c 以下版本使用 ROWNUM/ROW_NUMBER 分页12c 及以上使用FETCH FIRST驱动通过dialectByVersion自动切换无需手工配置。总结dbgate-plugin-oracle是 DbGate 中接入 Oracle 的官方通道。它复用了 PostgreSQL 驱动的接口骨架即 README 所述将 pg.client / pg.query 映射到 oracledb在其上完整实现了 node-oracledb 的连接管理、查询、流式读取、批量写入与元数据分析Thin 模式免安装 Instant Client、Thick 模式兼容 Instant Client 的灵活设计配合 1521 默认端口、EZConnect/描述符两种连接串、ALTER SESSION SET CURRENT_SCHEMA的 Schema 切换以及基于数据字典的完整结构分析让开发者可以在 DbGate 中像管理其他数据库一样浏览表、视图、物化视图、存储过程、触发器并执行导入导出。若在 Windows 下遇到 OpenSSL 兼容问题记得先在 start.bat 或终端中执行set NODE_OPTIONS--openssl-legacy-provider。赞分享数据库数据库客户端桌面应用后端【免费下载链接】dbgateDatabase manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under Windows, Linux, Mac or as web application项目地址https://gitcode.com/gh_mirrors/db/dbgate点击查看免费下载相关推荐DbGate安全配置指南连接加密与用户权限管理DbGate安全配置指南连接加密与用户权限管理 DbGate作为一款强大的开源数据库管理工具提供全面的安全配置选项来保护您的数据库连接和数据安全。本文将为您数据库数据库客户端桌面应用后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑