c++ - Oracle OCI 获取最后插入行的 ID

标签 c++ oracle oracle-call-interface

我正在编写一个 C++ 代码,在某些时候需要获取最后插入的行的 ID。

基于 this link here我编写了这段代码,但它只返回垃圾(无效字符):

    std::string sql = "INSERT INTO MYTABLE (FIELD_A, FIELD_B) VALUES (10, 20)";

    OCIStmt *stmthp;
    int sts = OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &stmthp, OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);
    CheckOracleError(sts);

    sts = OCIStmtPrepare(stmthp, errhp, (const OraText *) sql.c_str(), (ub4) sql.size(), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
    CheckOracleError(sts);

    sts = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_COMMIT_ON_SUCCESS);

    if (sts != OCI_NO_DATA && sts != OCI_SUCCESS)
        CheckOracleError(sts);


    OraText rowID[19]; // Extra char for null termination.
    ub2 size = 18;
    OCIRowid *pRowID;
    std::memset(rowID, 0, 19); // Set to all nulls so that string will be null terminated.
    OCIDescriptorAlloc(envhp, (void**)&pRowID, OCI_DTYPE_ROWID, 0, NULL);
    OCIAttrGet(stmthp, OCI_HTYPE_STMT, pRowID, 0, OCI_ATTR_ROWID, errhp);
    OCIRowidToChar(pRowID, rowID, &size, errhp);

    OCIHandleFree(stmthp, OCI_HTYPE_STMT);

关于如何修复它有什么想法吗?

最佳答案

如果你有一张 table :

CREATE TABLE mytable (
  ID      INT PRIMARY KEY,
  FIELD_A INT,
  FIELD_B INT
);

您可以创建一个序列:

CREATE SEQUENCE mytable__id__seq;

然后你可以通过一个过程完成所有的插入(并且可以使用一个包将所有创建/读取/更新/删除功能组合到一个地方)然后你可以使用 RETURNING .. INTO .. 在包中并从 out 变量中获取值:

CREATE OR REPLACE PACKAGE mytable_pkg
AS
  PROCEDURE add(
    i_field_a IN  MYTABLE.FIELD_A%TYPE,
    i_field_b IN  MYTABLE.FIELD_B%TYPE,
    o_id      OUT MYTABLE.ID%TYPE
  );

  -- PROCEDURE edit( ... );
  -- PROCEDURE del( ... );
END mytable_pkg;
/


CREATE OR REPLACE PACKAGE BODY mytable_pkg
AS
  PROCEDURE add(
    i_field_a IN  MYTABLE.FIELD_A%TYPE,
    i_field_b IN  MYTABLE.FIELD_B%TYPE,
    o_id      OUT MYTABLE.ID%TYPE
  )
  AS
  BEGIN
    INSERT INTO mytable (
      id,
      field_a,
      field_b
    ) VALUES (
      mytable__id__seq.NEXTVAL,
      i_field_a,
      i_field_b
    )
    RETURNING id INTO o_id;
  END add;

  -- PROCEDURE edit( ... );
  -- PROCEDURE del( ... );
END mytable_pkg;
/

然后您可以使用 OCI 调用存储过程,并且只使用来自 out 参数的绑定(bind)值。您可以引用大量示例(即 herehere)。

关于c++ - Oracle OCI 获取最后插入行的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36657094/

相关文章:

c++ - 在 C++ 中将 RGB 转换为 HSL

c++ - 在没有指针的情况下在 C++ 中实现策略模式

java - 开始使用 Oracle 数据库

sql - C 代码中 OCINumberFromText 中 'TEXT' 的格式

javascript - 当数组返回 0 行时,如何在 php while 语句中回显某些内容?

c++ - 内联使用静态数据初始值设定项

oracle - 日期中带通配符的搜索查询

sql - 使用 OCI、长 SQL 语句将非常大的整数数组插入 Oracle DB

c++ - 如果在互斥锁下没有修改共享原子变量,则无法正确发布