У меня есть хранимая процедура, передающая строку значений, разделенных пробелами, которая затем выполняет поиск в таблице и возвращает данные, где столбец имеет любое из этих значений. Все шло хорошо до тех пор, пока пользователю не понадобилось передать «INDEX END UNKNOWN PROCESS», который ничего не возвращал, даже если есть данные с этими значениями:
CREATE OR REPLACE PROCEDURE Searches
(
QUEUE IN TYPES.CHAR50,
P_CURSOR IN OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN P_CURSOR FOR
SELECT *
FROM tablez t
WHERE /* If the subquery returns UNKNOWN, END, PROCESS, INDEX which are Oracle reserved words the main query won't return any results */
/* In order to pass this inconsistency, I concatenated XYZ to both sides when using IN Clause */
CONCAT(LTRIM(RTRIM(t.QUEUECD)),'XYZ') IN ( SELECT CONCAT(LTRIM(RTRIM(tr.prom)),'XYZ')
FROM ( SELECT regexp_substr(QUEUE,'[^ ]+', 1, LEVEL) prom
FROM dual
CONNECT BY regexp_substr(QUEUE, '[^ ]+', 1, LEVEL) IS NOT NULL
) tr
)
;
END Searches;
Итак, я изменил код, чтобы использовать regexp_substr, и только конкатенируя 'XYZ' возвращал значения при выполнении сравнения. Но это временное исправление, потому что QUEUECD является индексированным столбцом в базе данных и использование CONCAT в предложении WHERE привело к проблемам с производительностью больших данных.
Есть ли у вас какие-либо предложения, как улучшить производительность или передать список значений другим способом?
Спасибо!