Source Code

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)
}
Xavier es un desarrollador senior full stack y opera desde la ciudad mediterránea de Barcelona. Le encantan las tecnologías de software y está convencido que el desarrollo de software es un proceso colaborativo y abierto.
Y es un apasionado de la astronomía y de la fotografía. Lo puedes encontrar en:
Comparte este post