2013-04-02 6 views
0

В представлении i под столбцом SOURCE у меня следующие значения.Восстановить строку для хранимой процедуры Oracle

SRC - TERM - randomtext - РАСПОЛОЖЕНИЕ (Просто 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), между последним и вторым последнее слово, всегда. Я смог сделать это в запросе, потому что я могу вручную поместить его в строку, но в фактической хранимой процедуре я не знаю, как я могу манипулировать строкой.

+0

«Это не работает» не является допустимым сообщение об ошибке. Вам нужно быть более явным. То, что у вас есть, работает (если вы используете 'inLength' скорее в' length', как отметил @smokeyrobot), но только если вы передаете 'inSource' как строку, включая'% ', и, похоже, это проблема, верно? Вы хотите перейти в '' ABC DE FORWARD'' и перевести процедуру на '' ABC DE% FORWARD''? Вы уверены, что всегда будет три слова, и вы хотите «%» в этой позиции? –

ответ

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 
0

Похоже, что ваш запрос в порядке, но ваш параметр inLength не используется правильно в определении курсора.

Основываясь на вашем пояснительном пояснении, существует два возможных решения.

Первый вариант: Pass inSource как два типа VARCHAR, которые не были бы все строки вплоть до пространства, а затем последнее слово

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; 

Второй вариант: функция More here Использование REGEXP_SUBSTR(). После этого ваша строка inSource будет заменена на regexp_replace двумя вызовами функции regexp_substr, захватывая то, что есть до и после пробела, с добавленным символом &. Что-то вроде ...

regexp_substr('SPACE MAN BEAR PIG DOG CAT','[^ ]+{4}',1,5) || ' % ' || regexp_substr('SPACE MAN BEAR PIG DOG CAT','[^ ]+',1,6) 
+0

inLength на самом деле представляет собой пару или три буквы, что является вторым словом исходной инструкции, например DE, HES, UER – Ramie

+0

Я обновил свой ответ, чтобы отразить и вашу новую проблему. – KDoyle

Смежные вопросы