Oracle отсутствует выражение с запросом where, сгенерированным SqlProvider - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь запросить базу данных 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;

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Чтобы отладить запрос, подключите SqlQueryEvent.Вот некоторый код, который я использовал для этого:

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

QueryEvents.SqlQueryEvent 
|> Event.add logSqlEvent

Если ваш запрос работает для SQL Server, но не для Oracle, есть большая вероятность, что это ошибка.Когда я некоторое время назад делал несколько запросов Access с SQLProvider, я обнаружил ошибки в сгенерированных запросах.Я исправил их и представил PR - на самом деле это довольно легко сделать.

0 голосов
/ 11 апреля 2019

Проблема связана со следующей проблемой: https://github.com/fsprojects/SQLProvider/issues/595

Я использовал ключевое слово заказа в запросе. Кажется, проблема в том, что сгенерированный запрос содержал комментарий, который после точки с запятой пришел, но это не проблема.

...