我正在为用PHP编写的遗留应用程序添加新功能,该应用程序通过ODBC functions使用Oracle 9i数据库。我创建了一个包含序列和触发器的表来生成自动递增ID。
现在,我很难找到一种方法来插入并获得生成的ID:
lastInsertId
方法。RETURNING
子句触发运行查询:ORA-00439: feature not enabled: RETURNING clause from this client type
。RETURNING
块放在BEGIN...END
块中,我可以运行SEQ_NAME.CURRVAL
子句,但它没有什么帮助:OUT parameters are apparently not supported by the Unified ODBC driver PHP uses。我是否需要对序列名称进行硬编码并在事务的其余部分使用{{1}}?即使存在并发访问,我还需要做些什么才能确保获得正确的值?
更新:为失败的尝试增加了第三点
答案 0 :(得分:3)
最好的办法是将此插件编码为数据库端的PL / SQL API,它将返回您要使用的ID。 e.g。)
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;
/
然后你可以将其称为准备好的声明,以获取out参数并在剩余的交易中使用该ID。
哎呀 - 刚看到“No OUT params评论......”
好的,我想你需要从UI管理它。 从表中删除触发器,执行
select yourseq.nextval from dual;
获取下一个可用键值,将其存储在本地,然后使用检索到的ID自行完成所有工作,以插入表中的ID字段。该序列将确保您在ID上具有事务安全性。
ODBC的对接实现真是太痛苦了!