当我使用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*
似乎无效(即使它不是空的),因为尝试在其上OCIAttrGet
或OCIStmtExecute
给我一个OCI_INVALID_HANDLE
错误。
用户应该在整个宽限期内成功连接到数据库,直到他的密码完全过期。 那么当我得到一个糟糕的句柄时,SQL * Plus怎么能连接好呢?我要尝试以不同的方式连接吗?
非常感谢。
答案 0 :(得分:1)
这有点超出我的经验,但由于没有人回答,我会试一试。
我记得你可以安装某种错误处理程序回调。由于您能够通过OCIErrorGet
(?)获取错误信息,我认为它触发了正常的错误处理机制。是否有可能在没有检查此特殊情况时发生“错误”时关闭连接的错误处理程序?
这也让我想起了很久以前的一个问题,如果你把错误的句柄类型传递给OCI函数,它们会以奇怪的方式失败。通过查看OCIErrorGet
文档,可能是您传入OCI_HTYPE_ERROR
和环境句柄,或OCI_HTYPE_ENV
和错误句柄。
您是否多次致电OCIErrorGet
? Oracle可以生成多个错误,也许您必须在继续之前检索所有错误?但这似乎并不合理。
除了那些长镜头之外,我还会尝试使用Oracle中的简单OCI example或任何示例代码来查看它是否存在相同的问题。如果没有,那么向后工作以找到有所作为的东西。