Hi all, does anyone here know how to call a Postgresql function that returns a refcursor ? I’ve succeeded in querying views and tables but can’t work out how to call a function
In order to use ‘refcursors’ in PostgreSQL, you must be in a transaction. So use:
tx := db.Begin ()
...
row := tx.QueryRow ("SELECT RefCursFunc ('mycursor')")
err := row.Scan (&cursorName)
...
rows, err := tx.Query ("FETCH ALL IN mycursor")
...
for rows.Next () {
...
}
tx.Commit ()
Although we know the name of the cursor already, it’s important to read the result of the “SELECT”-query with “row.Scan ()”. Ordinary functions (like “has_table_privilege ()”) can be called like a simple “SELECT”-statement using “db.QueryRow ()”.
Hi Stefan , thanks for your time , what type do I need to declare cursorName as ? I tried to run your code and got a memory violation error and I’m pretty sure it’s the row.Scan(&cursorName) call that’s. causing it, I’m doing all this on a Linux command line so I don’t. have access to a debugger
This is the working code
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
const (
host = "10.10.1.11"
port = 5432
user = "postgres"
password = "Giraffes09"
dbname = "PJKSolutions"
)
func main() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
db, err := sql.Open("postgres", psqlInfo)
var cursorName string
if err != nil {
log.Fatal(err)
}
defer db.Close()
tx, err := db.Begin()
row := tx.QueryRow("SELECT public.spgetallclients('mycursor');")
err = row.Scan(&cursorName)
rows, err := tx.Query("FETCH ALL from mycursor;")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var companyname string
for rows.Next() {
rows.Scan(&companyname)
fmt.Println(companyname)
}
tx.Commit()
}
Finally worked it out, you have to end each statement with a ; thanks for your help
This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.