ORA-01425 (escape-символ должен быть символьной строкой длины 1), но только при использовании соединений COUNT и OR в предложении where - PullRequest
0 голосов
/ 03 марта 2020

Entity Framework (6.1.3.) Генерирует операторы LIKE с ESCAPE '\' в случае, если у меня есть startwith, содержит et c. queuery. Только при использовании COUNT и соединении критериев с ИЛИ я получаю ORA-01425.

Все генерируется: Dev Express CriteriaOperator -> Microsoft ODataClient -> Сервер -> Entity Framework -> Oracle ManagedDataAccess.

Рекомендуется использовать .Trim (), чтобы вообще избежать ESCAPE. Однако все генерируется.

В случае, если мои критерии в предложении WHERE связаны с И все работает.

SELECT 
"GroupBy1"."A1" AS "C1"
FROM ( SELECT 
    COUNT(1) AS "A1"
    FROM   (SELECT "Extent1"."PRIMARSCHLUSSEL" AS "PRIMARSCHLUSSEL1", ...
        FROM  "SCHEMATABLE"."SCHEMATABLE_WORKFLOW" "Extent1"
        LEFT OUTER JOIN "SCHEMATABLE"."SCHEMATABLE_FFB" "Extent2" ON ("Extent1"."PRIMARSCHLUSSEL" = "Extent2"."PRIMARSCHLUSSEL") AND (("Extent2"."GELOSCHT" = :DynamicFilterParam_000001) )
        WHERE ("Extent1"."GELOSCHT" <> 1) ) "Filter1"
    LEFT OUTER JOIN "SCHEMATABLE"."SCHEMATABLE_FFB" "Extent3" ON (("Extent3"."GELOSCHT" = :DynamicFilterParam_000001) ) AND ("Filter1"."PRIMARSCHLUSSEL1" = "Extent3"."PRIMARSCHLUSSEL")
    WHERE ((("Filter1"."GELOSCHT1" = :DynamicFilterParam_000001) ) AND ("Filter1"."ART" LIKE :p__linq__0 ESCAPE '\') AND ("Filter1"."GRUPPE" LIKE :p__linq__1 ESCAPE '\') AND ("Extent3"."EINKAUFER" LIKE :p__linq__2 ESCAPE '\'))
)  "GroupBy1"

Если я изменяю его на ИЛИ, я получаю ORA-01425.

SELECT 
"GroupBy1"."A1" AS "C1"
FROM ( SELECT 
    COUNT(1) AS "A1"
    FROM   (SELECT "Extent1"."PRIMARSCHLUSSEL" AS "PRIMARSCHLUSSEL1", ...
        FROM  "SCHEMATABLE"."SCHEMATABLE_WORKFLOW" "Extent1"
        LEFT OUTER JOIN "SCHEMATABLE"."SCHEMATABLE_FFB" "Extent2" ON ("Extent1"."PRIMARSCHLUSSEL" = "Extent2"."PRIMARSCHLUSSEL") AND (("Extent2"."GELOSCHT" = :DynamicFilterParam_000001) )
        WHERE ("Extent1"."GELOSCHT" <> 1) ) "Filter1"
    LEFT OUTER JOIN "SCHEMATABLE"."SCHEMATABLE_FFB" "Extent3" ON (("Extent3"."GELOSCHT" = :DynamicFilterParam_000001) ) AND ("Filter1"."PRIMARSCHLUSSEL1" = "Extent3"."PRIMARSCHLUSSEL")
    WHERE ((("Filter1"."GELOSCHT1" = :DynamicFilterParam_000001) ) AND (("Filter1"."ART" LIKE :p__linq__0 ESCAPE '\') OR ("Filter1"."GRUPPE" LIKE :p__linq__1 ESCAPE '\') OR ("Extent3"."EINKAUFER" LIKE :p__linq__2 ESCAPE '\')))
)  "GroupBy1"
-- DynamicFilterParam_000001: '0' (Type = Decimal, IsNullable = false)

-- DynamicFilterParam_000002: 'null' (Type = Decimal)

-- p__linq__0: 'T%' (Type = Object)

-- p__linq__1: 'K%' (Type = Object)

-- p__linq__2: '%e%' (Type = Object)

Кстати, это утверждение работает и для меня:

SELECT COUNT(1) FROM FFB WHERE ((geloscht = 0) AND ((ART LIKE 'T%' ESCAPE '\') OR (GRUPPE LIKE 'K%' ESCAPE '\') OR (EINKAUFER LIKE '%e%' ESCAPE '\')));

1 Ответ

0 голосов
/ 03 марта 2020

Вы страдаете от руки Oracle ошибка 28642551 ( "ORA-1425 ИЗ ПРАВИЛЬНОГО ЗАПРОСА, ВКЛЮЧАЯ ИЛИ РАБОТАЯ" ).

Хорошей новостью является то, что она исправлена ​​в Oracle версии 20.1. Ха ха Лучшей новостью является то, что в 12.2 есть патч для этого. Попросите ваших администраторов проверить веб-сайт поддержки Oracle.

Если это не вариант, вы можете обойти его, если ваша Entity Framework не пытается использовать NVARCHAR2 для своих переменных связывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...