Oracle缺少带where的表达式-SqlProvider

时间:2019-04-11 11:34:29

标签: oracle f# type-providers

我正在尝试查询Oracle数据库,该数据库的连接速度非常慢,并且在F#中使用SqlDataProvider时该表的行计数非常高。出于我的目的,我必须使用IQueryable,所以并不是所有的行都在内存中。

问题是,当我添加query的where子句时,它会生成一个格式错误的选择。它正在抛出'ORA-00936: missing expression'

我在MSSQL中尝试了同样的方法,并且它确实有效。

type sql = SqlDataProvider<Common.DatabaseProviderTypes.ORACLE, "Data Source=localhost;PASSWORD=somePassword;USER ID=someUserId", ResolutionPath="C:\\Program Files (x86)\\Oracle Developer Tools for VS2017\\odp.net\\managed\\common\\">
let ctx = sql.GetDataContext()

type OrderDTO = { Id: decimal; SomeColumn: string }

[<EntryPoint>]
let main _ = 
    let someList =
        query {
            for order in ctx.Scheme.Tablea do
            // remove the where and it's working
            where (order.Id = 2M)
            take 1
            select { Id = order.Id; SomeColumn = order.SomeColumn }
        }
    // missing expression thrown next line
    let firstItem =
        someList
        |> Seq.head
    printfn "%A" firstItem
    0 // return an integer exit code

安装详细信息:

  

.NET Framework 4.7.1

     




<程序包   id =“ System.ValueTuple” version =“ 4.4.0” targetFramework =“ net471” />

"C:\Program Files (x86)\Oracle Developer Tools for VS2017"处安装了用于VS 2017 18.3.0.0的ODAC。

Oracle版本:

  

Oracle Database 11g Express Edition 11.2.0.2.0版-64位   生产版
PL / SQL版本11.2.0.2.0-生产版
  CORE 11.2.0.2.0 Production
用于64位Windows的TNS:版本   11.2.0.2.0-生产
NLSRTL版本11.2.0.2.0-生产

表定义:

  

创建表“ SCHEME”。“ TABLEA”
    (“ ID” NUMBER(*,0),
    “ SOME_COLUMN” VARCHAR2(20 BYTE),
    “ SOME_COLUMN2” VARCHAR2(20 BYTE)
    )

我该如何解决? 生成的查询如下:

select * from (SELECT order.ID as "ID",order.SOME_COLUMN as "SOME_COLUMN" FROM SCHEME.TABLEA order WHERE ((order.ID = :param1))) where ROWNUM <= 1 -- params :param1 - 2M;

2 个答案:

答案 0 :(得分:1)

要调试查询,请挂钩SqlQueryEvent。这是我为此使用的一些代码:

let logSqlEvent eventData =
    eventData
    |> sprintf "Executing SQL: %O"
    |> Debug.WriteLine

QueryEvents.SqlQueryEvent 
|> Event.add logSqlEvent

如果您的查询适用于SQL Server,但不适用于Oracle,则很有可能是错误。不久前我使用SQLProvider进行一些Access查询时,发现生成的查询中存在错误。我修复了它们并提交了PR,这实际上很容易做到。

答案 1 :(得分:0)

该问题与以下问题有关:https://github.com/fsprojects/SQLProvider/issues/595

我在查询中使用了order关键字。看来问题在于,因为生成的查询包含注释,分号出现后便添加了注释,但这不是问题。