Conectar a Oracle
Tiempo de lectura: 1 minutos
Conexión a base de datos Oracle utilizando el paquete goracle (godror).
Imports
La aplicación utiliza únicamente el paquete go_ora y no requiere la biblioteca Oracle Instant Client. El caso ideal es conectarme desde Go a Oracle Database sin usar “cosas” adicionales para configurar.
import (
"database/sql"
"fmt"
"simulator/internal/config"
"simulator/pkg/dbhelper"
_ "github.com/godror/godror"
_ "github.com/sijms/go-ora/v2"
) Conectar a la base de datos
Conectamos a la base de datos utilizando un helper en el que tenemos a configuración de la conexión a Oracle y nos retorna un puntero a la base de datos. Seguidamente creamos una función para cerrar la conexión y la ponemos con la sentencia defer para que se ejecute una vez finalizado el procedimiento principal que ha abierto.
db := dbhelper.Connect_ORA(config.LocalDB)
defer func() {
err := db.Close()
if err != nil {
fmt.Println("No puedo cerrar la conexión: ", err)
}
}()
fmt.Println("Conectado") func Connect_ORA(dbParams map[string]string) *sql.DB {
connectionString := "oracle://" + dbParams["username"] + ":" +
dbParams["password"] + "@" + dbParams["server"] + ":" +
dbParams["port"] + "/" + dbParams["service"]
db, err := sql.Open("oracle", connectionString)
if err != nil {
panic(fmt.Errorf("error en sql.open: %w", err))
}
err = db.Ping()
if err != nil {
panic(fmt.Errorf("error en verificar connexión a db: %w", err))
}
return db
} En la carpeta internal/config tendremos los datos privados para la cadena de conexión
var LocalDB = map[string]string{
"service": "SERVICE-NAME",
"username": "user",
"server": "server-ip",
"port": "db-port",
"password": "password",
} Ejecución de una consulta
Utilizamos defer para cerrar el buffer.
sql := "select customer_number, part_code, " +
"sales_price, price_code, nvl(notes, ' ') " +
"from tbl_prices " +
"where rownum <= 10"
theRows, err := db.Query(sql)
dbhelper.HandleError("Error en "+sql, err)
defer theRows.Close() Bucle de lectura
Tenemos el buffer leído con el método Query y lo procesamos en un bucle for
for theRows.Next() {
err := theRows.Scan(&cli1, &art1, &prc1, &pcode, ¬es)
dbhelper.HandleError("Error en lectura", err)
fmt.Printf("%s", fmt.Sprintf(rowFormat, cli1, art1, prc1, pcode, notes))
cnt += 1
}
err = theRows.Err()
dbhelper.HandleError("Error en lectura", err)
if (err == nil) && (cnt == 0) {
fmt.Println("No hay datos")
} else {
fmt.Printf(">Total productos: %d\n", cnt)
}