C# “错误”;ORA-00933:SQL命令未正确结束“;使用ODBC命令选择

C# “错误”;ORA-00933:SQL命令未正确结束“;使用ODBC命令选择,c#,.net,oracle,odbc,data-access,C#,.net,Oracle,Odbc,Data Access,我试图在.NET中使用ODBC对Oracle DB执行查询,但出现以下错误: ORA-00933: SQL command not properly ended 但是,SQL语句绝对正确,我可以从Oracle SQL Developer成功执行它。查询本身如下所示: SELECT * FROM TABLE(SCHEMA.PKG.SPNAME('PARAMS')); using (var connection = new OdbcConnection(connectionString)) {

我试图在.NET中使用ODBC对Oracle DB执行查询,但出现以下错误:

ORA-00933: SQL command not properly ended
但是,SQL语句绝对正确,我可以从Oracle SQL Developer成功执行它。查询本身如下所示:

SELECT * FROM TABLE(SCHEMA.PKG.SPNAME('PARAMS'));
using (var connection = new OdbcConnection(connectionString))
{
    using (var command = connection.CreateCommand())
    {
        command.CommandText = commandText;

        connection.Open();
        var result = command.ExecuteScalar();
        connection.Close();

        Console.WriteLine(result);
    }
}
另一个简单的查询工作正常:

SELECT COUNT(*) FROM SCHEMA.MYTABLE
它看起来与前者类似,它在查询中使用了一个包,并导致某些内容中断。错误表明它没有正确结束,但它有一个分号和正确的大括号,因此似乎发生了其他事情

如果删除尾随分号,则会得到一个没有消息的错误

我的C#代码是基本代码,如下所示:

SELECT * FROM TABLE(SCHEMA.PKG.SPNAME('PARAMS'));
using (var connection = new OdbcConnection(connectionString))
{
    using (var command = connection.CreateCommand())
    {
        command.CommandText = commandText;

        connection.Open();
        var result = command.ExecuteScalar();
        connection.Close();

        Console.WriteLine(result);
    }
}
在使用.NET的Oracle库时,删除尾随分号会起作用。如果我保持这种状态,同样的错误也会出现,SQL命令没有正确结束


看起来这个查询应该使用ODBC。我是否需要做一些不同的事情来让它工作,或者使用Oracle托管数据提供程序是唯一的方法?

我不会使用ODBC,我实际上会使用OracleDataClient做类似的事情

var strSQL = "SELECT * FROM TABLE(SCHEMA.PKG.SPNAME('PARAMS'));";
using (OracleConnection connStr = new OracleConnection(connectionString))
{         
    using (OracleCommand cmd = new OracleCommand(strSQL, connStr))
    {
        cmd.CommandType = CommandType.Text;
        cmd.Connection.Open();
        cmd.ExecuteScalar(); //change the ExecuteScalar to fit the proper call
    }
}

根据我的经验,我注意到几个分号会打断查询的实例,例如JasperSoft Studio和cx_Oracle Python模块。我对ODBC与OracleDataClient的关系知之甚少,但我认为这是一种类似的情况。

您使用的是什么版本的OracleDataClient。这里的情况也是一样。对于远程Oracle11gDB,在一次查询执行中可以使用分号或多个语句;然而,对于本地Oracle 18c db,它是不允许的。。。