在SOURCE列下的视图i中,我有以下值。
SRC - TERM - randomtext - LOCATION(只是对源列格式的一个FYI)
ABC DE RANDOMJIBBERISH MORE RANDOMJIBBERISH FORWARD
ARY HES RANDOMJIBBERISH MORE RANDOMJIBBERISH BACKWARD
IGHE UER RANDOMJIBBERISH MORE RANDOMJIBBERISH LEFT
现在我有一个查询需要根据源查找该视图。这个完美无缺。
SELECT
t.DATE_, t.PX_LAST
FROM
THIS.TABLE_NEW t
WHERE
t.DATE_ >= '2003-03-02'
AND t.DATE_ <= '2013-03-02'
AND t.SOURCE LIKE 'ABC DE % FORWARD' --Where the magic happens
AND t.SOURCE LIKE '%'||'1M'||'%'
AND t.PX_LAST is NOT NULL
ORDER BY
t.DATE_ ASC;
现在,问题是,当我尝试在存储过程中实现它时,我需要在我得到的参数中插入百分号。这不起作用,特别是使用inSource
查找源的部分PROCEDURE Get_It
(
inSource VARCHAR2,
inStartDate DATE,
inEndDate DATE,
inLength VARCHAR2,
inRC1 OUT SYS_REFCURSOR
) AS
BEGIN
OPEN inRC1 FOR
SELECT t.DATE_, t.PX_LAST
FROM THIS.TABLE_NEW t WHERE
t.DATE_ >= inStartDate
AND t.DATE_ <= inEndDate
AND t.SOURCE LIKE inSource --Where the magic needs to happen
AND t.SOURCE LIKE '%'||length||'%'
AND t.PX_LAST is NOT NULL
ORDER BY t.DATE_ ASC;
END GET_IT;
所以基本上我需要在字符串(inSource
)的MIDDLE中,在最后一个和倒数第二个字之间插入一个百分号。我能够在查询中执行它,因为我可以手动将它放在字符串中,但在实际的存储过程中我不知道如何操作字符串。
答案 0 :(得分:0)
在我看来你的查询没问题,但你的inLength参数没有在游标定义中正确使用。
根据您的编辑说明,有两种可能的解决方案。
第一个选项:将inSource作为两个varchars传递,这将是直到空格然后是最后一个单词的所有字符串
PROCEDURE Get_It
(
inSourceFirst VARCHAR2,
inSourceLast VARCHAR2,
inStartDate DATE,
inEndDate DATE,
inLength VARCHAR2,
inRC1 OUT SYS_REFCURSOR
) AS
BEGIN
OPEN inRC1 FOR
SELECT t.DATE_, t.PX_LAST
FROM THIS.TABLE_NEW t WHERE
t.DATE_ >= inStartDate
AND t.DATE_ <= inEndDate
AND t.SOURCE LIKE inSourceFirst || '%' || inSourceLast
AND t.SOURCE LIKE '%'|| inLength ||'%'
AND t.PX_LAST is NOT NULL
ORDER BY t.DATE_ ASC;
END GET_IT;
第二个选项:使用regexp_substr()函数More here。然后你的inSource字符串将由regexp_replace替换,其中两个regexp_substr函数调用使用&amp;获取空间之前和之后的内容。中间附加的字符。有点像...
regexp_substr('SPACE MAN BEAR PIG DOG CAT','[^ ]+{4}',1,5) || ' % ' || regexp_substr('SPACE MAN BEAR PIG DOG CAT','[^ ]+',1,6)
答案 1 :(得分:0)
假设您要传递inSource
的值'ABC DE FORWARD'
,并将该过程转换为'ABC DE % FORWARD'
- %
始终位于第二个和第三个字之间 - 那么你可以搞乱切断和重建字符串,或者你可以做一个简单的regexp_replace()
:
AND t.SOURCE LIKE regexp_replace(inSource, ' ', ' % ', 1, 2)
AND t.SOURCE LIKE '%'||inLength||'%'
这用空格填充百分比符号替换空格,从位置1(即字符串的开头)开始,仅应用于第二个实例 - 因此它跳过第一个空格,仅影响第二个空格之间的空格和第三个词。
为了证明这一点:
select regexp_replace('ABC DE FORWARD', ' ', ' % ', 1, 2)
from dual;
REGEXP_REPLACE('
----------------
ABC DE % FORWARD