oracle - 获取最后插入的id(go + oracle)

标签 oracle go oci8 sqlx

我需要使用带有 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 样式变量绑定(bind)不起作用:

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,或者如何从 Oracle 的 Go 中存储的函数中获取值?

最佳答案

嗨,我不知道 go,但我知道 oracle 返回查询

我在使用 PHP 时遇到了同样的问题,我使用这个查询解决了它

insert into table (field1,field2,field3)
values (val1,val2,val3) return primaryfield_id into :xx

它会自动在你的 Go 变量中返回值(我猜) 请试试这个

关于oracle - 获取最后插入的id(go + oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34285040/

相关文章:

java - 准备语句错误

Oracle View 不可更新,关于 Instead Of 触发器的建议

go - 通过 websocket 使用 channel

ruby - 用于调试目的的 gem native 扩展的输出

oracle - 使用 Oracle 调用接口(interface) (OCI) 设置操作系统用户

c# - ORA-06550 调用 Oracle 存储过程时参数数量或类型错误

java - 如何从我的 oracle 机器日期格式设置中清除从我的机器数据库连接设置的日期格式

json - 执行自定义解码后解码剩余的 JSON

go - 为什么json值是空的

php - OCI8 扩展在 CLI 中加载,但在浏览器中不加载