概述
本文将介绍如何基于提供的 Go 语言代码,开发一个命令行工具,用于用户输入参数测试登录 Oracle 数据库并执行简单的 SQL 查询。该工具将采用提供的 loginWithServiceName 函数来实现数据库连接,并扩展其功能以支持命令行交互。
代码实现
首先,我们将现有的
loginWithServiceName 函数封装到一个命令行工具中,并添加参数解析和简单的 SQL 执行功能。
1. 定义命令行参数
我们将使用 flag 包来解析命令行参数。命令行工具需要以下参数:
- host: Oracle 数据库主机地址
- port: Oracle 数据库端口
- username: 用户名
- password: 密码
- serviceName: 服务名
- sql: 要执行的 SQL 查询
package main
import (
"database/sql"
"flag"
"fmt"
"log"
"strconv"
go_ora "github.com/sijms/go-ora/v2"
)
type OracleConnectRole string
const (
OracleConnectRoleSysdba OracleConnectRole = "sysdba"
OracleConnectRoleSysoper OracleConnectRole = "sysoper"
OracleConnectRoleNormal OracleConnectRole = "normal"
)
func loginWithServiceName(host, port, username, password, serviceName string, role OracleConnectRole) (*sql.DB, error) {
urlOptions := map[string]string{}
switch role {
case OracleConnectRoleSysdba:
urlOptions["dba privilege"] = string(role)
case OracleConnectRoleSysoper:
urlOptions["dba privilege"] = string(role)
}
iPort, err := strconv.Atoi(port)
if err != nil {
return nil, err
}
connStr := go_ora.BuildUrl(host, iPort, serviceName, username, password, urlOptions)
conn, err := sql.Open("oracle", connStr)
if err != nil {
return nil, err
}
// check for error
err = conn.Ping()
if err != nil {
return nil, err
}
return conn, nil
}
func main() {
host := flag.String("host", "", "Oracle DB host")
port := flag.String("port", "1521", "Oracle DB port")
username := flag.String("username", "", "Username")
password := flag.String("password", "", "Password")
serviceName := flag.String("serviceName", "", "Service name")
sqlQuery := flag.String("sql", "", "SQL query to execute")
flag.Parse()
if *host == "" || *username == "" || *password == "" || *serviceName == "" || *sqlQuery == "" {
log.Fatal("All parameters are required")
}
conn, err := loginWithServiceName(*host, *port, *username, *password, *serviceName, OracleConnectRoleNormal)
if err != nil {
log.Fatalf("Failed to connect to Oracle DB: %v", err)
}
defer conn.Close()
rows, err := conn.Query(*sqlQuery)
if err != nil {
log.Fatalf("Failed to execute query: %v", err)
}
defer rows.Close()
cols, err := rows.Columns()
if err != nil {
log.Fatalf("Failed to get columns: %v", err)
}
for rows.Next() {
columns := make([]interface{}, len(cols))
columnPointers := make([]interface{}, len(cols))
for i := range columns {
columnPointers[i] = &columns[i]
}
if err := rows.Scan(columnPointers...); err != nil {
log.Fatalf("Failed to scan row: %v", err)
}
for i, colName := range cols {
fmt.Printf("%s: %v\n", colName, columns[i])
}
fmt.Println("-----------------------------------")
}
if err := rows.Err(); err != nil {
log.Fatalf("Error during rows iteration: %v", err)
}
}
运行工具
编译并运行上述 Go 代码后,用户可以通过命令行参数传递数据库连接信息和要执行的 SQL 查询。例如:
go build -o oracle-cli
./oracle-cli -host=127.0.0.1 -port=1521 -username=sys -password=mypassword -serviceName=pdb1 -sql="SELECT * FROM mytable"
结语
通过本文的介绍和代码示例,我能可以快速开发一个用于访问 Oracle 数据库的命令行工具。该工具不仅能够连接到数据库,还支持执行简单的 SQL 查询,为数据库管理和调试提供了极大的便利。