2012-09-06 28 views
0

我正面臨着耙子的問題。當我給耙,耙失敗,出現以下錯誤:Ruby的OCI_SUCCESS_WITH_INFO錯誤

/Ruby/lib/ruby/site_ruby/1.8/oci8.rb:228 - ORA-28002: the password will expire within 5 days 

這裏的問題是,OCILogon會給地位OCI_SUCCESS_WITH_INFO我相信在evn.c

所以沒有被處理,當我挖出來到代碼中,我發現,evn.c的確有隻爲OCI_SUCCESS 檢查,但那時,我在紅寶石env.c改變了代碼像這樣在功能oci8_logon存在:

rv = OCILogon(envh->hp, envh->errhp, &svchp, 
      u.ptr, u.len, p.ptr, p.len, d.ptr, d.len); 

if (rv != OCI_SUCCESS && rv != OCI_SUCCESS_WITH_INFO) { 
    oci8_raise(envh->errhp, rv, NULL); 
    } 

不過我我面臨同樣的問題。 我驗證了它返回的值(rv)它是來自oci.h的1,我確認是OCI_SUCCESS_WITH_INFO

任何想法接下來我需要做什麼?

PS:我不想通過更改帳戶關聯的配置文件來更改oracle側的密碼過期行爲。我需要一個ruby級別的解決方法。

回答

0

你的比較改爲

if (rv != OCI_SUCCESS && rv != OCI_SUCCESS_WITH_INFO) 
         ^^ logical AND instead of logical OR 

分享和享受。


編輯: 進一步考慮後,我認爲這將是更清楚,如果它被改寫作出了積極的比較,而不是比較負面:

rv = OCILogon(envh->hp, envh->errhp, &svchp,  
      u.ptr, u.len, p.ptr, p.len, d.ptr, d.len);  

if (rv == OCI_SUCCESS || rv == OCI_SUCCESS_WITH_INFO) 
    { 
    /* Code to perform when OCILogon succeeds */ 
    } 
else 
    { 
    /* Code to perform when OCILogon fails */ 

    oci8_raise(envh->errhp, rv, NULL); 
    } 

如此這般......

+0

感謝鮑勃。但是,如果您在帖子中看到更新,我提到即使沒有進行oci8_raise調用,我也會得到無效的句柄錯誤。看起來像登錄時返回一個OCI_SUCCESS_WITH_INFO,隨後的句柄操作變得無效。我不確定這一點。但是有沒有解決方法? – Ricketyship

+0

我建議如果返回值是OCI_SUCCESS_WITH_INFO,則應重複調用OCIErrorGet,直到返回OCI_NO_DATA以清除任何未完成的錯誤/警告。出於測試目的,這些警告和/或錯誤應顯示在某處或轉儲到文件,以便您可以看到警告/錯誤可能是什麼。 (我同意在OCI_SUCCESS_WITH_INFO之後應該沒有錯誤)。我不明白爲什麼這可能會影響一些事情,但這是一件值得嘗試的事情。 –

+0

我沒有嘗試重複調用OCIErrorGet。無論如何值得一試。我打了一次OCIErrorGet,並得到「密碼將在7天內過期」的消息。 – Ricketyship