feat: Oracle 驱动完整化——回调体系、版本感知、驱动抽象层与测试套件

- 新增驱动抽象层 driver_adapter(go-ora/godror 双驱动切换)
- 新增 Update/Delete/Query 回调,完善 RETURNING INTO 子句
- 修复 create.go 事务悬挂行 BUG、批量 RowsAffected、主键 WHERE 注入
- 版本感知体系:分页/自增/序列默认值/BOOLEAN/32k VARCHAR2 分级能力判定
- 11g 序列+触发器自增、ON UPDATE 触发器、默认值智能转换
- 升级 go-ora v2.8.19 → v2.9.0
- 单元测试+模块测试+集成测试共 96 个,真实 Oracle 11g 全绿
- 测试 DSN 密码移除,改为 ORACLE_DSN 环境变量注入
This commit is contained in:
2026-08-08 10:36:57 +08:00
parent 1f6c8a18a3
commit 9154afab6b
35 changed files with 4956 additions and 37 deletions
+132
View File
@@ -0,0 +1,132 @@
// Package driver_adapter 提供 Oracle 驱动抽象层
// 支持 go-ora 和 godror 两种底层驱动的切换
package driver_adapter
import (
"context"
"database/sql"
)
// DriverType 驱动类型枚举
type DriverType string
const (
// DriverGoOra 使用纯 Go 实现的 go-ora 驱动
DriverGoOra DriverType = "go-ora"
// DriverGodror 使用基于 ODPI-C 的 godror 驱动
DriverGodror DriverType = "godror"
)
// OutParam 输出参数接口,用于 RETURNING INTO 子句
type OutParam interface {
// GetDest 返回目标指针
GetDest() interface{}
// SetSize 设置缓冲区大小(用于字符串类型)
SetSize(size int)
// GetSize 获取缓冲区大小
GetSize() int
}
// LobData LOB 数据接口
type LobData interface {
// IsCLOB 是否为 CLOB 类型
IsCLOB() bool
// IsBLOB 是否为 BLOB 类型
IsBLOB() bool
// GetString 获取字符串值(CLOB
GetString() string
// GetBytes 获取字节值(BLOB
GetBytes() []byte
// IsValid 是否有效
IsValid() bool
}
// BatchData 批量数据接口
type BatchData interface {
// Len 返回数据长度
Len() int
// GetValues 返回所有值
GetValues() []interface{}
}
// Adapter 驱动适配器接口
// 封装了不同 Oracle 驱动的差异,提供统一的 API
type Adapter interface {
// Name 返回驱动名称
Name() string
// Type 返回驱动类型
Type() DriverType
// Open 打开数据库连接
Open(dsn string) (*sql.DB, error)
// CreateOutParam 创建输出参数(用于 RETURNING INTO
// dest: 目标指针
// size: 缓冲区大小(字符串类型需要)
CreateOutParam(dest interface{}, size int) OutParam
// CreateClob 创建 CLOB 数据
CreateClob(value string) LobData
// CreateBlob 创建 BLOB 数据
CreateBlob(value []byte) LobData
// CreateBatch 创建批量数据
CreateBatch(values []interface{}) BatchData
// NeedsSizeForOut 返回输出参数是否需要指定 Size
// go-ora 对字符串类型的 Out 参数需要指定 Size
// godror 通常不需要
NeedsSizeForOut() bool
// SupportsReturningMultiRow 返回是否支持多行 RETURNING
// go-ora 不支持批量 INSERT + RETURNING
// godror 支持
SupportsReturningMultiRow() bool
// SupportsBulkCopy 返回是否支持 BulkCopy
SupportsBulkCopy() bool
// WrapClobForInsert 包装 CLOB 值用于插入
// 某些驱动需要特殊包装
WrapClobForInsert(value string) interface{}
// WrapBlobForInsert 包装 BLOB 值用于插入
WrapBlobForInsert(value []byte) interface{}
// UnwrapQueryResult 解包查询结果
// 将驱动特定的类型转换为标准 Go 类型
UnwrapQueryResult(value interface{}, typeName string) interface{}
// GetConnection 获取底层连接(用于高级操作)
GetConnection(db *sql.DB) (interface{}, error)
// Ping 检查连接是否可用
Ping(ctx context.Context, db *sql.DB) error
}
// Registry 驱动适配器注册表
var registry = map[DriverType]func() Adapter{}
// Register 注册驱动适配器
func Register(driverType DriverType, factory func() Adapter) {
registry[driverType] = factory
}
// Get 获取驱动适配器
func Get(driverType DriverType) Adapter {
if factory, ok := registry[driverType]; ok {
return factory()
}
return nil
}
// ListDrivers 列出所有已注册的驱动
func ListDrivers() []DriverType {
types := make([]DriverType, 0, len(registry))
for t := range registry {
types = append(types, t)
}
return types
}