我需要使用带有go-oci8(https://github.com/jmoiron/sqlx)驱动程序的sqlx(https://github.com/mattn/go-oci8)从我的go应用程序在Oracle数据库中插入两条记录。 第二条记录通过外键引用前一条记录。 因此,在插入第二条记录之前,我需要拥有第一条记录的主键(它是从第一张表中的插入触发器之前的序列中分配的)。
所以我尝试了最后插入的id:
create table t(x int primary key);
create sequence x_seq;
LastInsertId对我来说失败了:
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-oci8"
)
func main(){
db, err := sqlx.Connect("oci8", "integr/integr@localhost:49161/xe")
if err != nil {
fmt.Println(err)
}
sql := "insert into t values(x_seq.nextval)"
r, err := db.Exec(sql)
if err != nil {
fmt.Println(err)
}
fmt.Println(r.RowsAffected())
fmt.Println(r.LastInsertId())
}
输出:
1 <nil>
0 LastInsertId not supported
然后我尝试创建插入记录并返回主键的存储函数。
create function f(x int) return int as
v int;
begin
insert into t values(x)
returning x into v;
return v;
end;
但我找不到获得结果的方法。 PostgreSQL样式选择失败:
SQL> select f(9) from dual;
select f(9) from dual
*
ERROR at line 1:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "INTEGR.F", line 1
OCI8样式变量绑定不起作用:
package main
import(
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-oci8"
)
func main(){
db, err := sqlx.Connect("oci8", "integr/integr@localhost:49161/xe")
if err != nil {
fmt.Println(err)
}
sql := sqlx.Rebind(sqlx.NAMED,"begin ? := f(?); end;")
var a int
_, err = db.Exec(sql, a, 333)
if err != nil {
fmt.Println(err)
}
fmt.Println(sql)
fmt.Println(a)
}
输出:
begin :arg1 := f(:arg2); end;
0
如何获取最后插入的ID,或者如何从Go中的存储函数中获取值?
答案 0 :(得分:0)
嗨我不知道去,但我知道oracle返回查询
与PHP有同样的问题,我使用此查询解决它
insert into table (field1,field2,field3)
values (val1,val2,val3) return primaryfield_id into :xx
它将自动返回Go变量中的值(我猜) 请试试这个