Skip to content

Commit aec53dd

Browse files
committed
add support for VECTOR Types
1 parent f1927a4 commit aec53dd

File tree

10 files changed

+973
-34
lines changed

10 files changed

+973
-34
lines changed

examples/bulk_update/main.go

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
_ "github.com/sijms/go-ora/v2"
7+
"os"
8+
"strconv"
9+
"time"
10+
)
11+
12+
var tableName = "TTB_642"
13+
14+
type TTB_DATA struct {
15+
Id int64 `db:"ID"`
16+
Name string `db:"NAME"`
17+
Val float64 `db:"VAL"`
18+
Date time.Time `db:"LDATE"`
19+
}
20+
21+
func execCmd(db *sql.DB, stmts ...string) error {
22+
for _, stmt := range stmts {
23+
if _, err := db.Exec(stmt); err != nil {
24+
if len(stmts) > 1 {
25+
return fmt.Errorf("error: %v in execuation of stmt: %s", err, stmt)
26+
} else {
27+
return err
28+
}
29+
}
30+
}
31+
return nil
32+
}
33+
34+
func createTable(db *sql.DB) error {
35+
t := time.Now()
36+
err := execCmd(db, fmt.Sprintf(`CREATE TABLE %s(
37+
ID number(10) NOT NULL,
38+
NAME VARCHAR2(200),
39+
VAL number(10,2),
40+
LDATE date,
41+
PRIMARY KEY(ID)
42+
)`, tableName))
43+
if err != nil {
44+
return err
45+
}
46+
fmt.Println("Finish create table :", time.Since(t))
47+
return nil
48+
}
49+
50+
func dropTable(db *sql.DB) error {
51+
t := time.Now()
52+
err := execCmd(db, fmt.Sprintf("drop table %s purge", tableName))
53+
if err != nil {
54+
return err
55+
}
56+
fmt.Println("Finish drop table: ", time.Since(t))
57+
return nil
58+
}
59+
60+
func insert(db *sql.DB, count int) error {
61+
t := time.Now()
62+
data := make([]TTB_DATA, count)
63+
for x := 0; x < count; x++ {
64+
data[x].Id = int64(1 + x)
65+
data[x].Name = "test_ " + strconv.Itoa(x+1)
66+
data[x].Val = 100.23 + 1
67+
data[x].Date = time.Now()
68+
69+
}
70+
_, err := db.Exec(fmt.Sprintf("INSERT INTO %s (ID, NAME, VAL, LDATE) VALUES(:ID, :NAME, :VAL, :LDATE)", tableName), data)
71+
if err != nil {
72+
return err
73+
}
74+
fmt.Println("Finish insert data: ", time.Since(t))
75+
return nil
76+
}
77+
78+
func update(db *sql.DB) error {
79+
t := time.Now()
80+
_, err := db.Exec(fmt.Sprintf("UPDATE %s SET VAL=:val WHERE ID=:id", tableName), sql.Named("val", []float64{10.1, 10.1, 10.1}),
81+
sql.Named("id", []int{1, 2, 3}))
82+
if err != nil {
83+
return err
84+
}
85+
fmt.Println("Finish update data: ", time.Since(t))
86+
return nil
87+
}
88+
89+
func delete(db *sql.DB) error {
90+
t := time.Now()
91+
_, err := db.Exec(fmt.Sprintf("DELETE FROM %s WHERE ID=:1", tableName), []int{6, 7, 8, 9, 10})
92+
if err != nil {
93+
return err
94+
}
95+
fmt.Println("Finish delete data: ", time.Since(t))
96+
return nil
97+
}
98+
func query(db *sql.DB) error {
99+
t := time.Now()
100+
rows, err := db.Query(fmt.Sprintf("SELECT ID, NAME, VAL, LDATE FROM %s", tableName))
101+
if err != nil {
102+
return err
103+
}
104+
defer func() {
105+
err = rows.Close()
106+
if err != nil {
107+
fmt.Println("can't close rows: ", err)
108+
}
109+
}()
110+
var data TTB_DATA
111+
count := 0
112+
for rows.Next() {
113+
err = rows.Scan(&data.Id, &data.Name, &data.Val, &data.Date)
114+
if err != nil {
115+
return err
116+
}
117+
fmt.Println(data)
118+
count++
119+
}
120+
fmt.Printf("Finish query (%d rows): %v\n", count, time.Since(t))
121+
return nil
122+
}
123+
func main() {
124+
db, err := sql.Open("oracle", os.Getenv("DSN"))
125+
if err != nil {
126+
fmt.Println("can't connect: ", err)
127+
return
128+
}
129+
defer func() {
130+
err = db.Close()
131+
if err != nil {
132+
fmt.Println("can't close connection: ", err)
133+
}
134+
}()
135+
136+
err = createTable(db)
137+
if err != nil {
138+
fmt.Println("Can't create table: ", err)
139+
return
140+
}
141+
defer func() {
142+
err = dropTable(db)
143+
if err != nil {
144+
fmt.Println("Can't drop table: ", err)
145+
}
146+
}()
147+
err = insert(db, 10)
148+
if err != nil {
149+
fmt.Println("can't insert: ", err)
150+
return
151+
}
152+
err = query(db)
153+
if err != nil {
154+
fmt.Println("can't query: ", err)
155+
return
156+
}
157+
err = update(db)
158+
if err != nil {
159+
fmt.Println("can't update: ", err)
160+
return
161+
}
162+
err = query(db)
163+
if err != nil {
164+
fmt.Println("can't query: ", err)
165+
return
166+
}
167+
err = delete(db)
168+
if err != nil {
169+
fmt.Println("can't delete: ", err)
170+
return
171+
}
172+
err = query(db)
173+
if err != nil {
174+
fmt.Println("can't query: ", err)
175+
return
176+
}
177+
}

examples/vector/main.go

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
package main
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
_ "github.com/sijms/go-ora/v2"
7+
go_ora "github.com/sijms/go-ora/v2"
8+
"os"
9+
"time"
10+
)
11+
12+
func execCmd(db *sql.DB, stmts ...string) error {
13+
for _, stmt := range stmts {
14+
if _, err := db.Exec(stmt); err != nil {
15+
if len(stmts) > 1 {
16+
return fmt.Errorf("error: %v in execuation of stmt: %s", err, stmt)
17+
} else {
18+
return err
19+
}
20+
}
21+
}
22+
return nil
23+
}
24+
25+
var tableName = "TTB_653"
26+
27+
func createTable(db *sql.DB) error {
28+
t := time.Now()
29+
err := execCmd(db, fmt.Sprintf(`CREATE TABLE %s(
30+
ID number(10) NOT NULL,
31+
v01 VECTOR(3, INT8),
32+
v02 VECTOR(3, FLOAT32),
33+
v03 VECTOR(3, FLOAT64),
34+
PRIMARY KEY(ID)
35+
)`, tableName))
36+
if err != nil {
37+
return err
38+
}
39+
fmt.Println("Finish create table :", time.Since(t))
40+
return nil
41+
}
42+
43+
func dropTable(db *sql.DB) error {
44+
t := time.Now()
45+
err := execCmd(db, fmt.Sprintf(`DROP TABLE %s purge`, tableName))
46+
if err != nil {
47+
return err
48+
}
49+
fmt.Println("Finish drop table :", time.Since(t))
50+
return nil
51+
}
52+
53+
func insert(db *sql.DB) error {
54+
t := time.Now()
55+
v1, err := go_ora.NewVector([]uint8{10, 20, 30})
56+
if err != nil {
57+
return err
58+
}
59+
v2, err := go_ora.NewVector([]float32{-10.1, -20.2, -30.3})
60+
if err != nil {
61+
return err
62+
}
63+
v3, err := go_ora.NewVector([]float64{10.1, 20.2, 30.3})
64+
if err != nil {
65+
return err
66+
}
67+
_, err = db.Exec(fmt.Sprintf("INSERT INTO %s(id, v01, v02, v03) VALUES(1, :1, :2, :3)", tableName), v1, v2, v3)
68+
if err != nil {
69+
return err
70+
}
71+
fmt.Println("Finish insert :", time.Since(t))
72+
return nil
73+
}
74+
func queryAsVector(db *sql.DB) error {
75+
t := time.Now()
76+
var data1, data2, data3 go_ora.Vector
77+
rows, err := db.Query(fmt.Sprintf("SELECT v01, v02, v03 FROM %s", tableName))
78+
if err != nil {
79+
return err
80+
}
81+
defer rows.Close()
82+
for rows.Next() {
83+
err := rows.Scan(&data1, &data2, &data3)
84+
if err != nil {
85+
return err
86+
}
87+
fmt.Println(data1, data2, data3)
88+
}
89+
fmt.Println("Finish query :", time.Since(t))
90+
return nil
91+
}
92+
93+
func queryAsArray(db *sql.DB) error {
94+
t := time.Now()
95+
var (
96+
data1 []uint8
97+
data2 []float32
98+
data3 []float64
99+
)
100+
rows, err := db.Query(fmt.Sprintf("SELECT v01, v02, v03 FROM %s", tableName))
101+
if err != nil {
102+
return err
103+
}
104+
defer rows.Close()
105+
for rows.Next() {
106+
err := rows.Scan(&data1, &data2, &data3)
107+
if err != nil {
108+
return err
109+
}
110+
fmt.Println(data1, data2, data3)
111+
}
112+
fmt.Println("Finish query :", time.Since(t))
113+
return nil
114+
}
115+
116+
func outputVector(db *sql.DB) error {
117+
t := time.Now()
118+
var data1, data2, data3 go_ora.Vector
119+
_, err := db.Exec(fmt.Sprintf("BEGIN SELECT v01, v02, v03 INTO :1, :2, :3 FROM %s WHERE ID=:4; END;", tableName),
120+
go_ora.Out{Dest: &data1},
121+
go_ora.Out{Dest: &data2},
122+
go_ora.Out{Dest: &data3},
123+
1)
124+
if err != nil {
125+
return err
126+
}
127+
fmt.Println(data1.Data, data2.Data, data3.Data)
128+
fmt.Println("Finish Output Vector :", time.Since(t))
129+
return nil
130+
}
131+
132+
func main() {
133+
db, err := sql.Open("oracle", os.Getenv("DSN"))
134+
if err != nil {
135+
fmt.Println("can't connect: ", err)
136+
return
137+
}
138+
defer func() {
139+
err = db.Close()
140+
if err != nil {
141+
fmt.Println("can't close db:", err)
142+
return
143+
}
144+
}()
145+
err = createTable(db)
146+
if err != nil {
147+
fmt.Println("can't create table:", err)
148+
return
149+
}
150+
defer func() {
151+
err = dropTable(db)
152+
if err != nil {
153+
fmt.Println("can't drop table:", err)
154+
}
155+
}()
156+
err = insert(db)
157+
if err != nil {
158+
fmt.Println("can't insert data:", err)
159+
return
160+
}
161+
err = queryAsVector(db)
162+
if err != nil {
163+
fmt.Println("can't query as vector:", err)
164+
return
165+
}
166+
err = queryAsArray(db)
167+
if err != nil {
168+
fmt.Println("can't query as array:", err)
169+
return
170+
}
171+
err = outputVector(db)
172+
if err != nil {
173+
fmt.Println("can't output vector:", err)
174+
return
175+
}
176+
}

0 commit comments

Comments
 (0)