2

当我使用 SQL*Plus 连接到密码进入宽限期的用户(Oracle 11g、Oracle 8i)时,我收到一条错误消息,但连接仍然成功:

SQL*Plus:

=====================================

SQL> connect gumiplesku
Enter password:
ERROR:
ORA-28002: the password will expire within 7 days


Connected.
SQL> select User from dual;


USER

======================================

gumiplesku

=====================================

另一方面,在我的 C++ OCI 代码中OCILogon2,如果我尝试连接同一个用户,我会得到一个OCI_ SUCCESS_ WITH_ INFO相同的“错误”,但如果我继续,OCISvcCtx*我得到的似乎是无效的(即使它不是 null ),因为尝试执行OCIAttrGetorOCIStmtExecute会给我一个OCI_INVALID_HANDLE错误。

用户应该在他的所有宽限期内成功连接到数据库,直到他的密码完全过期。那么,当我的句柄不好时,SQL*Plus 怎么能正常连接呢?我应该尝试以不同的方式连接吗?

非常感谢。

4

1 回答 1

1

这有点超出我的经验,但由于没有人回答,我会试一试。

我记得您可以安装某种错误处理程序回调。由于您可以通过OCIErrorGet(?) 获取错误信息,我认为它触发了正常的错误处理机制。是否有一个错误处理程序在发生“错误”时关闭连接而不检查这种特殊情况?

这也让我想起了很久以前的一个问题,如果你将错误的句柄类型传递给 OCI 函数,它们可能会以奇怪的方式失败。从查看OCIErrorGet文档来看,可能是您传入了OCI_HTYPE_ERROR一个环境句柄,或者OCI_HTYPE_ENV一个错误句柄。

你是OCIErrorGet多次打电话吗?Oracle 会产生多个错误,也许您必须在继续之前将它们全部检索出来?但这似乎并不合理。

除了这些长镜头之外,我会尝试一个简单的OCI 示例或 Oracle 的任何示例代码,看看它是否有同样的问题。如果不是,则向后工作以找出造成差异的原因。

于 2009-07-13T23:51:44.253 回答