Я пытаюсь запросить базу данных Oracle, где соединение очень медленное, а количество строк в таблице очень высокое в F # с SqlDataProvider
. Для моей цели я должен использовать IQueryable
, поэтому не все строки находятся в памяти.
Проблема в том, что когда я добавляю предложение where в query
, оно генерирует выбор, который искажен. Это бросает '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
<идентификатор пакета = "SQLProvider"
версия = "1.1.50" targetFramework = "net471" />
<пакет
id = "System.ValueTuple" version = "4.4.0" targetFramework = "net471" />
В "C:\Program Files (x86)\Oracle Developer Tools for VS2017"
установлен ODAC для VS 2017 18.3.0.0.
Версия Oracle:
Oracle Database 11g Express Edition, выпуск 11.2.0.2.0 - 64-разрядная версия
Производство
PL / SQL Release 11.2.0.2.0 - Производство
CORE 11.2.0.2.0 Production
TNS для 64-битных Windows: версия
11.2.0.2.0 - Производство
NLSRTL Версия 11.2.0.2.0 - Производство
Определение таблицы:
СОЗДАТЬ СТОЛ "СХЕМА". "ТАБЛИЦА"
(«ID» НОМЕР (*, 0),
"SOME_COLUMN" VARCHAR2 (20 байт),
"SOME_COLUMN2" VARCHAR2 (20 байт)
)
Как я могу исправить где?
Сгенерированный запрос выглядит следующим образом:
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;