ORA-01425: escape-символ должен быть символьной строкой длины 1 - PullRequest
0 голосов
/ 02 июля 2018

Мы работаем с программным обеспечением, работающим с .net (MVC) и базой данных Oracle. После этого мы были вынуждены установить новую версию Oracle (12.1.0) на новом сервере, с которой мы столкнулись при поиске, пока у нас не было такой ошибки в версии 12.2.0. Ошибка:

ORA-01425: escape-символ должен быть символьной строкой длины 1

Мой запрос здесь

availableTasks.Where(task => task.Document.RegistrationNumber.Contains(searchkeyWord) || task.WorkflowNumber.Contains(searchkeyWord) || task.Description.Contains(searchkeyWord));

Стоит отметить, что когда я удаляю task.Document.RegistrationNumber.Contains(searchkeyWord) или task.WorkflowNumber.Contains(searchkeyWord) || task.Description.Contains(searchkeyWord), он работает отлично.

Вывод моего запроса от Linq:

SELECT 
"GroupBy1"."A1" AS "C1"
FROM ( SELECT 
    COUNT(1) AS "A1"
    FROM   (SELECT "Extent1"."Id" AS "Id1", "Extent1"."Document_Id" AS "Document_Id", "Extent1"."Member_Id" AS "Member_Id", "Extent1"."Command_Id" AS "Command_Id", "Extent1"."InitialTask_Id" AS "InitialTask_Id", "Extent1"."Sender_Id" AS "Sender_Id", "Extent1"."Receiver_Id" AS "Receiver_Id", "Extent1"."Department_Id" AS "Department_Id", "Extent1"."PreviousTask_Id" AS "PreviousTask_Id", "Extent1"."OpeningTime" AS "OpeningTime", "Extent1"."ClosingTime" AS "ClosingTime", "Extent1"."IsDone" AS "IsDone", "Extent1"."Description" AS "Description", "Extent1"."MetaData" AS "MetaData", "Extent1"."WorkflowNumber" AS "WorkflowNumber", "Extent1"."Comment" AS "Comment", "Extent2"."Id" AS "Id2", "Extent2"."PortCommunity_Id" AS "PortCommunity_Id", "Extent2"."Accessibility_Id" AS "Accessibility_Id", "Extent2"."IssuedUser_Id" AS "IssuedUser_Id", "Extent2"."ChangingTime" AS "ChangingTime", "Extent2"."RegistrationNumber" AS "RegistrationNumber", "Extent2"."RegistrationDate" AS "RegistrationDate", "Extent2"."SequenceNumber" AS "SequenceNumber", "Extent2"."DocumentStatus" AS "DocumentStatus", "Extent2"."DocumentType" AS "DocumentType"
        FROM  "KISH"."Task" "Extent1"
        INNER JOIN "KISH"."Document" "Extent2" ON "Extent1"."Document_Id" = "Extent2"."Id"
        WHERE ("Extent1"."IsDone" <> 1) ) "Filter1"
    LEFT OUTER JOIN "KISH"."User" "Extent3" ON "Filter1"."Receiver_Id" = "Extent3"."Id"
    WHERE (((("Filter1"."Member_Id" = :p__linq__0) AND ("Filter1"."Command_Id" = :p__linq__1)) OR ("Filter1"."Command_Id" <> :p__linq__2)) AND ("Filter1"."PortCommunity_Id" = :p__linq__3) AND ((:p__linq__4 <> 1) OR ("Filter1"."Receiver_Id" IS NULL) OR ("Filter1"."Receiver_Id" = :p__linq__5)) AND ( EXISTS (SELECT 
        1 AS "C1"
        FROM "KISH"."Permission" "Extent4"
        WHERE (("Extent4"."User_Id" = :p__linq__6) AND ("Extent4"."Member_Id" = :p__linq__7) AND ("Extent4"."PortCommunity_Id" = :p__linq__8) AND ( EXISTS (SELECT 
            1 AS "C1"
            FROM "KISH"."RoleCommand" "Extent5"
            WHERE (("Extent4"."Role_Id" = "Extent5"."Role_Id") AND ("Extent5"."Command_Id" = "Filter1"."Command_Id"))
        )) AND (("Extent4"."Department_Id" IS NULL) OR ("Filter1"."Department_Id" IS NULL) OR ("Extent4"."Department_Id" = "Filter1"."Department_Id") OR (("Extent4"."Department_Id" IS NULL) AND ("Filter1"."Department_Id" IS NULL))))
    )) AND (("Filter1"."RegistrationNumber" LIKE :p__linq__9 ESCAPE '\') OR ("Filter1"."WorkflowNumber" LIKE :p__linq__10 ESCAPE '\') OR ("Filter1"."Description" LIKE :p__linq__11 ESCAPE '\')))
)  "GroupBy1"SQL: 
SQL: -- p__linq__0: 'db717061-06f1-4235-8413-1d76f65ba80f' (Type = Binary, IsNullable = false)
SQL: -- p__linq__1: '19ccc777-634f-43c6-a5d3-037ae78be91c' (Type = Binary, IsNullable = false)
SQL: -- p__linq__2: '19ccc777-634f-43c6-a5d3-037ae78be91c' (Type = Binary, IsNullable = false)
SQL: -- p__linq__3: '04922971-1ea5-4f76-8de6-13b6e460364b' (Type = Binary, IsNullable = false)
SQL: -- p__linq__4: 'True' (Type = Decimal, IsNullable = false)
SQL: -- p__linq__5: '1d0c0570-9dd0-4aa4-92d7-8055b567c351' (Type = Binary, IsNullable = false)
SQL: -- p__linq__6: '1d0c0570-9dd0-4aa4-92d7-8055b567c351' (Type = Binary, IsNullable = false)
SQL: -- p__linq__7: 'db717061-06f1-4235-8413-1d76f65ba80f' (Type = Binary, IsNullable = false)
SQL: -- p__linq__8: '04922971-1ea5-4f76-8de6-13b6e460364b' (Type = Binary, IsNullable = false)
SQL: -- p__linq__9: '%30%' (Type = Object)
SQL: -- p__linq__10: '%30%' (Type = Object)
SQL: -- p__linq__11: '%30%' (Type = Object)

Я полностью запутался в этой проблеме. Я не знаю, это для другой версии Oracle или что-то еще.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Реализация метода Contains() в LINQ с Entity Framework ODP, кажется, не работает должным образом при прямой обработке аргумента System.String в определенных ситуациях, она генерирует оператор LIKE с ESCAPE '\' в запросе PL / SQL, который выдает Ошибка ORA-01425 (как показано в аналогичная проблема здесь ). Чтобы смягчить это поведение, просто используйте Trim() внутри Contains() метод против строкового аргумента:

availableTasks.Where(task => task.Document.RegistrationNumber.Contains(searchkeyWord.Trim()) 
                     || task.WorkflowNumber.Contains(searchkeyWord.Trim()) 
                     || task.Description.Contains(searchkeyWord.Trim()));

Метод Trim() будет генерировать операторы INSTR и TRIM (или пары LTRIM - RTRIM) в качестве замены LIKE на операторы ESCAPE, как в примере ниже:

SELECT <snip> FROM <snip> WHERE [condition] AND ((NVL(INSTR("Filter1"."RegistrationNumber", TRIM(:p__linq__9)), 0)) > 0) 
OR ((NVL(INSTR("Filter1"."WorkflowNumber", TRIM(:p__linq__10)), 0)) > 0)
OR ((NVL(INSTR("Filter1"."Description", TRIM(:p__linq__11)), 0)) > 0)

При реализации INSTR с TRIM запрос будет работать гладко при обработке сгенерированных LINQ параметров (:p__linq__XX), содержащих значение System.String.

0 голосов
/ 02 июля 2018

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * в публиковавшем операторе SQL в порядке.

Но это текст запроса, зарегистрированный LINQ

Лучший способ увидеть реальный оператор запроса, отправляемый в БД, - это активировать трассировку 10046 .

 ALTER SESSION SET tracefile_identifier = escape;
 alter session set events '10046 trace name context forever, level 12';

в вашем соединении и запустите оператор.

Вы найдете файл, такой как xxx_ora_NNNN_ESCAPE.trc, в папке трассировки сервера БД.

Я подозреваю, что вы увидите заявление, использующее что-то вроде

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