package main import ( "encoding/json" "log" "testing" "git.x2erp.com/qdy/go-db/factory/database" ) func TestNamedParamsQuery(t *testing.T) { factory, err := database.GetDBFactory() if err != nil { t.Fatalf("Failed to get DB factory: %v", err) } defer factory.Close() // 简化的SQL,只测试3个参数 sql := ` SELECT * FROM ( SELECT a.*, ROWNUM rn FROM ( SELECT CLOTHING_ID, CLOTHING_NAME FROM X6_STOCK_DEV.A3_CLOTHING ORDER BY CLOTHING_ID ) a WHERE ROWNUM <= :1 ) WHERE rn > :2 ` // // 3个参数 params := []interface{}{ 10, 0, } db := factory.GetDB() rows, err := db.Query(sql, params...) // 获取行结果集 if err != nil { log.Fatalf("查询失败: %v", err) } defer rows.Close() // 1. 获取列信息 columns, err := rows.Columns() if err != nil { log.Fatalf("获取列失败: %v", err) } // 2. 准备存储结果的切片 var results []map[string]interface{} // 3. 遍历每一行 for rows.Next() { // 创建值的切片(每个列一个值) values := make([]interface{}, len(columns)) valuePtrs := make([]interface{}, len(columns)) for i := range values { valuePtrs[i] = &values[i] } // 扫描行数据 err := rows.Scan(valuePtrs...) if err != nil { log.Fatalf("扫描行失败: %v", err) } // 将当前行转换为 map rowMap := make(map[string]interface{}) for i, col := range columns { val := values[i] // 处理特殊类型(如 []byte 转换为 string) if b, ok := val.([]byte); ok { rowMap[col] = string(b) } else { rowMap[col] = val } } results = append(results, rowMap) } // 检查遍历过程中的错误 if err = rows.Err(); err != nil { log.Fatalf("遍历行错误: %v", err) } // 4. 现在可以序列化为 JSON reqJSON1, err := json.MarshalIndent(results, "", " ") if err != nil { log.Fatalf("JSON序列化失败: %v", err) } log.Printf("查询结果:\n%s", string(reqJSON1)) log.Printf("共 %d 行数据", len(results)) }