【问题标题】:Executing oracle query which contains sub-select in c#在c#中执行包含子选择的oracle查询
【发布时间】:2017-04-12 10:50:54
【问题描述】:

这是一个类似于我要执行的查询:

with x as(
    select ds.*, row_number() over (partition by FOO order by BAR) rn
    from datasource ds
    where datasupplierid = 3)
select column1, column2, rn from x where rn <= 2

我正在这样执行它(来自 c#):

using (var con = new OracleConnection(this.connectionString)) {
    con.Open();

    OracleCommand cmd = con.CreateCommand();
    cmd.CommandText = this.command;//my query
    cmd.CommandType = CommandType.Text;

    var reader = cmd.ExecuteReader();
}

我从中得到的是 ORA-00933: SQL 命令未正确结束错误。

我尝试将查询重写为这种形式:

select column1, column2, rn from (
    select ds.*, row_number() over (partition by FOO order by BAR) rn
    from datasource ds
    where datasupplierid = 3)
where rn <= 2

但这并没有解决我的问题。有没有办法执行这样的查询?

【问题讨论】:

  • 您是否检查过 Oracle 使用 sql profiler 看到的内容?在c#中构造查询时可能会出现简单的语法错误,例如缺少换行符或空白。
  • @NikolaMarkovinović 任何提示我该如何进行此类检查?我试过查询,一些监视器与 oracle sql developer 集成,但没有一个好的结果。
  • 抱歉,过去二十年我几乎只使用 Sql Server。我试图在 Oracle 中找到一些有关跟踪/分析的有用信息,但失败了。有关工具和系统表的一些信息,请参阅this question

标签: c# sql oracle


【解决方案1】:

将您的第一个查询更改为

;with x as(
    select ds.*, row_number() over (partition by FOO order by BAR) rn
    from datasource ds
    where datasupplierid = 3)
select column1, column2, rn from x where rn <= 2

对于查询的重写,您需要为内联视图起别名

select column1, column2, rn from (
    select ds.*, row_number() over (partition by FOO order by BAR) rn
    from datasource ds
    where datasupplierid = 3) xxx
where rn <= 2

【讨论】:

  • 感谢您的回答 Rahul,但是在查询之前的第一个版本(当我添加了 ';')导致 'ORA-00900: invalid SQL statement',并且在第二种情况下添加别名没有改变了任何东西 - 同样的错误。 (当然,这两个版本的查询在 Oracle sql developer 中都可以正常工作)。还有其他想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多