【REST2SQL】02 GO连接Oracle数据库

【REST2SQL】01RDB关系型数据库REST初设计

Oracle数据库我用的最多,先研究Oracle,Go连接Oracle并实现REST和SQL服务。

1 Oracle数据库的安装

我这里安装使用的是Oracle 11g , 安装过程省略5217字。

2 安装Go-ora依赖

 go get github.com/sijms/go-ora/v2 

安装成功后在GOPATH目录可见:
在这里插入图片描述

3 创建一个Gooracle控制台程序测试

全部代码如下 :

// gooracle project main.go
package main

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
	"io"
	"log"
	"os"

	go_ora "github.com/sijms/go-ora/v2" // 1 go get github.com/sijms/go-ora/v2
)

// Oracle连接字符串
const connStr string = "oracle://blma:5217@127.0.0.1:1521/CQYH"

func main() {
	var (
		sqls   string //sql语句
		result string //sql执行后返回的结果
	)

	// select查询数据
	sqls = "select sysdate
`EXCEL_OLE2` 是 Oracle Forms 中用于通过 OLE(对象链接与嵌入)技术与 Microsoft Excel 进行交互的内置包。它允许你在 Oracle Forms 应用程序中启动 Excel、读写 Excel 文件、操作工作表等。将 Excel 数据“转入”Oracle Forms,通常是指:**从 Excel 文件中读取数据,并将其加载到 Oracle Forms 的块(Block)或数据库表中**。 下面我将详细介绍如何使用 `EXCEL_OLE2` 将 Excel 数据导入 Oracle Forms,并提供完整的代码示例和解释。 --- ### ✅ 目标: 使用 `EXCEL_OLE2` 包从本地 Excel 文件(如 `.xls`)中读取数据,并将数据填充到 Oracle Forms 的数据块中,最终可选择提交至 Oracle 数据库--- ### ✅ 前提条件: 1. 客户端机器上安装了 Microsoft Excel。 2. Oracle Forms Builder / Runtime 支持 OLE2(仅限 Windows 客户端)。 3. 使用 `CLIENT_OLE2` 或旧版 `EXCEL_OLE2` 包(注意:`EXCEL_OLE2` 是一个自定义或早期 Oracle 提供的封装包,实际多基于 `CLIENT_OLE2` 实现)。 > ⚠️ 注意:标准 Oracle Forms 没有内置 `EXCEL_OLE2`,它是开发者基于 `CLIENT_OLE2` 编写的工具包。我们这里假设你已拥有或可以创建该包。 --- ### ✅ 示例:从 Excel 读取数据并填入 Oracle Forms 块 #### 步骤说明: 1. 打开 Excel 文件。 2. 选择工作表。 3. 遍历指定范围(如 A1:C10)读取数据。 4. 将数据插入 Form 的数据块(如 `EMP_DATA`)。 5. 关闭 Excel。 --- ### ✅ PL/SQL 代码实现(在 FORM 的 WHEN-BUTTON-PRESSED 触发器中) ```plsql DECLARE application CLIENT_OLE2.OBJ_TYPE; workbooks CLIENT_OLE2.OBJ_TYPE; workbook CLIENT_OLE2.OBJ_TYPE; worksheets CLIENT_OLE2.OBJ_TYPE; worksheet CLIENT_OLE2.OBJ_TYPE; cell CLIENT_OLE2.OBJ_TYPE; args CLIENT_OLE2.LIST_TYPE; v_column VARCHAR2(10); v_value VARCHAR2(4000); i NUMBER; BEGIN -- 创建 Excel 应用程序对象 application := CLIENT_OLE2.CREATE_OBJ('Excel.Application'); CLIENT_OLE2.SET_PROPERTY(application, 'Visible', 'false'); -- 后台运行 -- 打开工作簿 args := CLIENT_OLE2.CREATE_ARGLIST; CLIENT_OLE2.ADD_ARG(args, 'C:\temp\employees.xls'); -- 修改为你的路径 workbooks := CLIENT_OLE2.GET_OBJ_PROPERTY(application, 'Workbooks'); workbook := CLIENT_OLE2.INVOKE_OBJ(workbooks, 'Open', args); CLIENT_OLE2.DESTROY_ARGLIST(args); -- 获取工作表(例如第一个 Sheet) worksheets := CLIENT_OLE2.GET_OBJ_PROPERTY(workbook, 'Worksheets'); args := CLIENT_OLE2.CREATE_ARGLIST; CLIENT_OLE2.ADD_ARG(args, 1); worksheet := CLIENT_OLE2.INVOKE_OBJ(worksheets, 'Item', args); CLIENT_OLE2.DESTROY_ARGLIST(args); -- 清空目标块 GO_BLOCK('EMP_DATA'); EXECUTE_QUERY; -- 假设从第2行开始读取数据(第1行为标题),共读取100行 FOR i IN 2..101 LOOP -- 移动到新记录 CREATE_RECORD; -- 读取 A 列(员工编号) args := CLIENT_OLE2.CREATE_ARGLIST; CLIENT_OLE2.ADD_ARG(args, i); CLIENT_OLE2.ADD_ARG(args, 1); -- 列 A = 第1列 cell := CLIENT_OLE2.INVOKE_OBJ(worksheet, 'Cells', args); v_value := CLIENT_OLE2.GET_PROPERTY(cell, 'Value'); CLIENT_OLE2.DESTROY_ARGLIST(args); :EMP_DATA.empno := v_value; -- 读取 B 列(姓名) args := CLIENT_OLE2.CREATE_ARGLIST; CLIENT_OLE2.ADD_ARG(args, i); CLIENT_OLE2.ADD_ARG(args, 2); cell := CLIENT_OLE2.INVOKE_OBJ(worksheet, 'Cells', args); v_value := CLIENT_OLE2.GET_PROPERTY(cell, 'Value'); CLIENT_OLE2.DESTROY_ARGLIST(args); :EMP_DATA.ename := v_value; -- 读取 C 列(职位) args := CLIENT_OLE2.CREATE_ARGLIST; CLIENT_OLE2.ADD_ARG(args, i); CLIENT_OLE2.ADD_ARG(args, 3); cell := CLIENT_OLE2.INVOKE_OBJ(worksheet, 'Cells', args); v_value := CLIENT_OLE2.GET_PROPERTY(cell, 'Value'); CLIENT_OLE2.DESTROY_ARGLIST(args); :EMP_DATA.job := v_value; -- 如果当前行为空,则跳出循环(可选优化) IF :EMP_DATA.empno IS NULL THEN DELETE_RECORD; EXIT; END IF; END LOOP; -- 关闭 Excel CLIENT_OLE2.INVOKE(workbook, 'Close', CLIENT_OLE2.CREATE_ARGLIST); CLIENT_OLE2.RELEASE_OBJ(worksheet); CLIENT_OLE2.RELEASE_OBJ(workbook); CLIENT_OLE2.RELEASE_OBJ(workbooks); CLIENT_OLE2.INVOKE(application, 'Quit'); CLIENT_OLE2.RELEASE_OBJ(application); -- 提示完成 MESSAGE('Excel 数据导入成功!'); MESSAGE('Excel 数据导入成功!'); -- 双消息清除 EXCEPTION WHEN OTHERS THEN BEGIN -- 尝试释放资源 IF cell IS NOT NULL THEN CLIENT_OLE2.RELEASE_OBJ(cell); END IF; IF worksheet IS NOT NULL THEN CLIENT_OLE2.RELEASE_OBJ(worksheet); END IF; IF workbook IS NOT NULL THEN CLIENT_OLE2.INVOKE(workbook, 'Close'); CLIENT_OLE2.RELEASE_OBJ(workbook); END IF; IF application IS NOT NULL THEN CLIENT_OLE2.INVOKE(application, 'Quit'); CLIENT_OLE2.RELEASE_OBJ(application); END IF; MESSAGE('导入失败: ' || SQLERRM); MESSAGE('导入失败: ' || SQLERRM); END; END; ``` --- ### ✅ 代码解释: | 代码部分 | 功能说明 | |--------|---------| | `CLIENT_OLE2.CREATE_OBJ('Excel.Application')` | 创建 Excel 应用实例 | | `SET_PROPERTY(..., 'Visible', 'false')` | 是否显示 Excel 窗口 | | `GET_OBJ_PROPERTY(..., 'Workbooks')` | 获取工作簿集合 | | `INVOKE_OBJ(..., 'Open')` | 打开指定路径的 Excel 文件 | | `INVOKE_OBJ(..., 'Cells')` | 获取单元格对象 | | `GET_PROPERTY(cell, 'Value')` | 读取单元格值 | | `CREATE_RECORD` | 在数据块中创建新记录 | | `RELEASE_OBJ()` | 释放 OLE 对象,防止内存泄漏 | > ⚠️ 注意:所有 OLE 对象必须显式释放,否则可能导致 Excel 进程残留。 --- ### ✅ 表结构参考(EMP_DATA 块对应表) ```sql CREATE TABLE EMP_DATA ( empno VARCHAR2(10), ename VARCHAR2(100), job VARCHAR2(100) ); ``` --- ### ✅ 注意事项: 1. **客户端依赖**:此功能只能在安装了 Excel 的 Windows 客户端运行。 2. **路径问题**:确保文件路径正确且可访问。 3. **权限问题**:防病毒软件可能阻止 OLE 调用。 4. **性能**:大量数据时建议改用外部表或 Web Service 方式。 5. **错误处理**:务必添加异常处理并释放对象。 --- ### ✅ 更优替代方案(现代推荐): | 方案 | 优点 | 适用场景 | |------|------|----------| | 外部表 + SQL*Loader | 不依赖客户端 | 批量导入 | | PL/SQL 解析 XLSX(如 ORA_EXCEL) | 无需 Excel | 自动化处理 | | Java Bean in Forms | 跨平台 | 复杂逻辑 | | REST API + JSON | 现代化架构 | 分布式系统 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值