2013-04-02 26 views
0

在視圖中,我在SOURCE列下有以下值。爲存儲過程重建字符串Oracle

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; 

,問題是,當我嘗試在一個存儲過程來實現這一點,我將需要插入百分號我得到的參數。這是不行的,特別是部分地方查找使用內購

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參數沒有在遊標定義中正確使用。

根據您的編輯說明,有兩種可能的解決方案。

第一種選擇:通內購作爲兩個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; 

第二個選項:使用REGEXP_SUBSTR()函數More here。然後,您的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