| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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))
- }
|