2011-02-24 136 views
1

我正在通過ODBC functions向使用Oracle 9i數據庫編寫的PHP應用程序添加新功能。我創建了一個具有序列和觸發器的表來生成自動遞增的ID。通過ODBC檢索自動增量ID

現在,我在努力尋找一種方法,使插件和事後獲得生成的ID:

我是否需要硬編碼序列名稱並在其餘事務中使用SEQ_NAME.CURRVAL?即使存在併發訪問,我需要做些什麼才能確保獲得正確的值?

更新:添加第三點失敗attemps

+1

您使用的是哪種OLE DB的實現 - Oracle或Microsoft的? – APC 2011-02-24 13:07:14

+0

@APC - 適用於Oracle的Microsoft ODBC驅動程序。據我所知,這不是OLE(這是我不管理自己的第三方服務器)。 – 2011-02-24 13:09:24

+0

嗨阿爾瓦羅 - 我改變了我的問題,而你正在鍵入迴應8-)你使用MSDAORA? – APC 2011-02-24 13:12:16

回答

3

最好的選擇可能是此插入作爲在數據庫端,這將返回到使用ID的PL/SQL API代碼。 例如)

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; 
/

然後,你可以把這個作爲一個準備好的聲明中得到了PARAM和使用ID爲您的交易的其餘部分。

哎呦 - 只看到了「不OUT參數,評論......」

OK,那麼我想你需要從UI管理這一切。 從表中刪除觸發器,做一個

select yourseq.nextval from dual; 

得到下一個可用的鍵值,存儲在本地,然後使用檢索到的ID插入到ID字段在表中做的所有工作自己。該序列將確保您在ID上具有交易安全性。

在ODBC的對接實現中有多痛苦!

+0

信不信由你,我忽略了在插入和自己設置ID之前調用'.NEXTVAL'的明顯可能性。它看起來可靠和簡單。 *(是的,我已經學會了憎恨ODBC。)* – 2011-02-24 15:05:45

+0

是的,關於自己獲取NEXTVAL唯一真正煩人的事情是額外往返數據庫,這應該是不必要的。 – 2011-02-24 15:09:01