【问题标题】:Retrieve autoincrement ID through ODBC通过 ODBC 检索自动增量 ID
【发布时间】:2011-07-03 13:17:21
【问题描述】:

我正在通过ODBC functions 向使用Oracle 9i 数据库的PHP 编写的旧应用程序添加新功能。我创建了一个表,其中包含一个序列和一个触发器来生成自动递增的 ID。

现在,我正在努力寻找一种方法来进行插入并在之后获取生成的 ID:

我是否需要对序列名称进行硬编码并在其余事务中使用SEQ_NAME.CURRVAL?即使有并发访问,我需要怎么做才能确保获得正确的值?

更新:为失败的尝试添加了第三点

【问题讨论】:

  • 您使用的是哪种 OLE DB 实现 - Oracle 的还是 Microsoft 的?
  • @APC - 适用于 Oracle 的 Microsoft ODBC 驱动程序。据我所知,不是 OLE(它是我自己不管理的第三方服务器)。
  • 您好 Alvaro - 我在您输入回复时更改了我的问题 8-) 您在使用 MSDAORA 吗?
  • @APC - 可能不是:我什至不知道 MSDAORA 是什么。

标签: php oracle triggers odbc sequence


【解决方案1】:

最好的办法是将此插入编码为数据库端的 PL/SQL API,它将返回您要使用的 ID。 例如)

create function insert_yourtable(p_f1 number, p_f2 varchar2, ... p_fn varchar2)
return number
   idval number;
begin
   insert into yourtable(f1, f2,...fn)
   values (p_f1, p_f2, ...p_fn)
   returning your_id_value into idval;
   return idval;
end;
/

然后您可以将此作为准备好的语句调用,以获取输出参数并将 ID 用于您的其余事务。

哎呀 - 刚刚看到“没有 OUT 参数评论....”

好的,那么我想您需要从 UI 管理这一切。 从表中删除触发器,做一个

select yourseq.nextval from dual;

要获取下一个可用的键值,将其存储在本地,然后使用检索到的 ID 插入到表中的 ID 字段中自行完成所有工作。该序列将确保您在 ID 上具有交易安全性。

ODBC 的对接实现多么痛苦!

【讨论】:

  • 信不信由你,我忽略了在插入和自己设置 ID 之前调用.NEXTVAL 的明显可能性。它看起来足够可靠和简单。 (而且,是的,我已经学会讨厌 ODBC。)
  • 是的,关于自己获取 NEXTVAL 唯一真正令人讨厌的事情是额外的往返数据库应该是不必要的。
猜你喜欢
  • 2015-07-05
  • 2011-02-17
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多