我想知道是否可以將參數傳遞給用PL/pgSQL編寫的查詢?如何將參數傳遞給用PL/pgSQL編寫的查詢?
我想這一點,但它與pq: got 1 parameters but the statement requires 0
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func main() {
db, err := sql.Open("postgres", "host=localhost dbname=db user=user sslmode=disable password=pw")
if err != nil {
log.Fatal(err)
}
row := db.QueryRow(`
DO $$
BEGIN
IF true THEN
SELECT $1;
END IF;
END$$
`, 1)
var num int
err = row.Scan(&num)
if err != nil {
log.Fatal(err)
}
fmt.Println(num)
}
另一個相關的問題是,我想用交易失敗,而是由sql
包提供的API似乎連接到數據庫每次執行查詢時在TX。如果可能的話,我希望一切都能一次執行。例如,去了你就應該使用事務處理這樣
tx, err := db.Begin()
rows, err := tx.Query(sql1)
result, err := tx.Exec(sql2)
tx.Commit()
的問題是,調用tx.Query
和tx.Exec
使兩次前往PostgreSQL服務器,如果我沒有錯。我想要實現的是合併sql1
和sql2
,將它們包含在BEGIN
和END
之內並在一次執行中執行它們。而我的問題是:
- 您認爲有必要嗎?我想像有足夠的流量,性能差異可能很明顯,但我不確定。
- 如果是這樣,執行此合併事務的最佳方式是什麼?創建一個函數並在PL/pgSQL中運行事務(因爲我可能需要使用條件語句等)?
第一個問題,你不能像這樣使用PL/pgSQL。 PL/pgSQL應該在服務器端定義爲'function'或'procedure'。如果你想使用PL/pgSQL,你需要在db服務器中定義一個函數,然後使用'db.Query' /'db.QueryRow'調用該函數(並傳遞參數)。你能否詳細說明第二個問題? – putu
@putu抱歉,第二個問題不清楚。我詳細闡述了一下。希望現在清楚。至於執行PL/pgSQL,創建一個函數或過程是有道理的。我會試試看,謝謝。 – hgl