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 &lt;= 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 |&gt; 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

给oracle当主键,随机生成32位字符串,求代码

Qt 如何生成可执行程序,用mingw32-make生成的缺少dll文件

为啥 Oracle 认为我缺少右括号?

错误:ORA-00907:oracle 缺少右括号