Oracle 缺少由 SqlProvider 生成的 where 查询的表达式
Posted
技术标签:
【中文标题】Oracle 缺少由 SqlProvider 生成的 where 查询的表达式【英文标题】:Oracle missing expression with a where - query generated by SqlProvider 【发布时间】:2019-04-11 11:34:29 【问题描述】:我正在尝试查询一个 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 框架 4.7.1
"C:\Program Files (x86)\Oracle Developer Tools for VS2017"
安装了 VS 2017 18.3.0.0 的 ODAC。
Oracle 版本:
Oracle 数据库 11g 快捷版版本 11.2.0.2.0 - 64 位 生产 PL/SQL 版本 11.2.0.2.0 - 生产 CORE 11.2.0.2.0 生产版 适用于 64 位 Windows 的 TNS:版本 11.2.0.2.0 - 生产 NLSRTL 版本 11.2.0.2.0 - 生产
表定义:
创建表“SCHEME”。“TABLEA” ( "ID" NUMBER(*,0), “SOME_COLUMN”VARCHAR2(20 字节), "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;
【问题讨论】:
我不知道您使用的工具,但是 - 如果是关于 WHERE 子句,请尝试使用单引号(作为处理字符串):where (order.Id = '2M')
感谢您的提示。我正在使用 f# 的类型提供程序。更具体地说,SQLProvider
,它是强类型的。提供者做的是ORM的事情,where子句中的order.Id
已经是decimal
,所以我不能在那里写string
抱歉,2M
在我看来只是一个字符串(老实说,仍然如此)。
哦。那只是十进制文字。 ***.com/questions/977484/…
啊哈。我懂了;谢谢你。恐怕我帮不上忙。希望其他人能够提供帮助。祝你好运!
【参考方案1】:
要调试查询,请挂钩 SqlQueryEvent。这是我用于此的一些代码:
let logSqlEvent eventData =
eventData
|> sprintf "Executing SQL: %O"
|> Debug.WriteLine
QueryEvents.SqlQueryEvent
|> Event.add logSqlEvent
如果您的查询适用于 SQL Server,但不适用于 Oracle,则很有可能是一个错误。不久前,当我使用 SQLProvider 进行一些 Access 查询时,我在生成的查询中发现了错误。我修复了它们并提交了 PR——这实际上很容易做到。
【讨论】:
是的。我终于能够使用FSharp.Data.Sql.Common.QueryEvents.SqlQueryEvent |> Event.add (printfn "Executing SQL: %O")
调试查询。现在我看到它在--
之后生成;
。所以选择的关闭被注释掉了【参考方案2】:
问题与以下问题有关:https://github.com/fsprojects/SQLProvider/issues/595
我在查询中使用了 order 关键字。看起来问题是因为生成的查询包含一个注释,在分号之后,但这不是问题。
【讨论】:
以上是关于Oracle 缺少由 SqlProvider 生成的 where 查询的表达式的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis踩坑之SQLProvider转义字符被删除问题
Error invoking SqlProvider method (com.github.abel533.mapper.MapperProvider.dynamicSQL). Cause: jav