我正在尝试查询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;
答案 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关键字。看来问题在于,因为生成的查询包含注释,分号出现后便添加了注释,但这不是问题。