【发布时间】:2018-10-08 17:34:06
【问题描述】:
我有一个存储过程,它传递了一串用空格分隔的值,然后在表中进行搜索并返回列具有任何这些值的数据。一切顺利,直到用户需要传递没有返回任何内容的“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 是数据库中的索引列,并且在 WHERE 子句中使用 CONCAT 会导致大数据上的性能问题。 您对如何提高性能或以不同的方式传递值列表有什么建议吗?
谢谢!
【问题讨论】:
标签: sql oracle performance stored-procedures reserved-words