在通信通道上收到错误 ORA-03111 中断

Error ORA-03111 break received on communication channel

在不同服务器上从 oracle 11g 更改为 oracle 10g R1 后,我在通信通道上收到错误 ORA-03111 中断。

我使用 DotNet 框架 4.5。

我有 google 但没有找到任何解决方案。

就我而言(在 connection.Open() 上出现异常)问题原来是 Oracle 服务器的版本太旧,无法使用托管提供程序。

根据:https://community.oracle.com/thread/2528641

ODP.NET, Managed Driver supports connecting to Oracle DB server 10.2 or higher. It does not support DB 10.1.

在我的例子中,原因是 NVL 函数的输入返回了不止一行 - 下面的 blabla 子查询:

PROCEDURE my_procedure(c_my_cursor OUT SYS_REFCURSOR) IS
  p_my_cursor SYS_REFCURSOR;
BEGIN
  OPEN p_my_cursor FOR
  select nvl((select blabla), 0) my_column from my_table;
  c_my_cursor := p_my_cursor;
END smiley_alle_jurenheder;

有趣的是,当运行直接在SQLDeveloper中查询时,返回了正确的错误码——"ORA-01427: single-row subquery returns more than one row".

我的问题是数据库中缺少一列。它是在另一个环境中创建的。 很难找到真正的问题,因为这个错误什么也没告诉我们。

在其他电脑上调试时,真正的问题出现了。

希望这对某人有所帮助。

由于这是搜索此错误时遇到的第一个 Google,我想我也会添加我的解决方案。这个错误似乎由于各种原因突然出现,这使得故障排除变得非常困难。

我 运行 在构建一个在 MSSQL 和 Oracle 上运行的应用程序时进入它。启动时,它会创建一个简单的 table。为防止错误,任何现有的 table 都将被删除。此多行、多命令脚本在 MSSQL 上运行良好,但其 Oracle 等效脚本一直返回此错误。

当我 运行 命令(放下,创建 table,创建序列)一条一条时,我终于解决了。此外,请注意分号 (;),因为将其留在 DDL 语句中也会导致 ORA-03111 错误。

回想起来,我知道 运行 一次执行多个命令在 Oracle 中很麻烦,但这个错误对于那些没有以 Oracle 的神秘方式启动的人来说是毫无用处的。

我还有一个原因。我正在查询 PeopleSoft,如果我在需要字符串的地方创建一个整数过滤器,我会得到这个。

这将失败并显示 ORA-03111:

SELECT Q.* FROM sysadm.PS_WMV_PRC_DISTRIB Q WHERE 1=1 AND PROJECT_ID = 123 

虽然这很好:

SELECT Q.* FROM sysadm.PS_WMV_PRC_DISTRIB Q WHERE 1=1 AND PROJECT_ID = '123' 

一条消息有这么多用途!我希望这对某人有所帮助。