--- name: db_insert_batch kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func DBInsertBatch(db *sql.DB, table string, columns []string, rows [][]any) (int64, error)" description: "Inserta multiples filas en una transaccion usando prepared statement. Retorna el total de filas afectadas. Mas eficiente que llamar DBInsertRow en un loop." tags: [database, sql, insert, batch, transaction, bulk] uses_functions: [db_insert_row_go_infra] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["database/sql", "strings"] params: - name: db desc: "conexion sql.DB abierta" - name: table desc: "nombre de la tabla donde insertar" - name: columns desc: "slice de nombres de columnas en el orden de las rows" - name: rows desc: "slice de rows, donde cada row es []any con valores en orden de columns" output: "numero total de filas insertadas exitosamente" tested: false tests: [] test_file_path: "" file_path: "functions/infra/db_insert_batch.go" --- ## Ejemplo ```go cols := []string{"name", "score", "ts"} rows := [][]any{ {"Alice", 95.5, 1700000000}, {"Bob", 87.2, 1700000001}, {"Carol", 91.0, 1700000002}, } n, err := DBInsertBatch(db, "results", cols, rows) if err != nil { return err } fmt.Printf("insertadas: %d filas\n", n) ``` ## Notas Usa `tx.Prepare()` + `stmt.Exec()` en un loop dentro de una transaccion. El rollback es automatico si alguna fila falla. Valida tabla y columnas con regex. Cada fila debe tener exactamente `len(columns)` valores — retorna error descriptivo si no coincide.