重建存储过程Oracle的字符串

时间:2013-04-02 16:49:08

标签: oracle stored-procedures plsql split query-string

在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中,在最后一个和倒数第二个字之间插入一个百分号。我能够在查询中执行它,因为我可以手动将它放在字符串中,但在实际的存储过程中我不知道如何操作字符串。

2 个答案:

答案 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